| |
|
知识库 -> 数码 -> 为什么现在软件对内存的消耗这么大? -> 正文阅读 |
|
[数码]为什么现在软件对内存的消耗这么大? |
[收藏本文] 【下载本文】 |
[图片] 一个百度网盘就点1个多G,打开浏览器看视频就2、3个G。视频明明是流媒体,观看体验上也是随看随缓存,怎么就占了这么多的内存?电脑8G的内存,… |
自从我提出一个把模型从20M优化到1M的方案被老板打回来说20M内存消耗不大可以忽略不计以后,我就知道我那8G内存的电脑用那些该死的软件为什么老是内存不足了。 |
你要感谢 1.界面web化,你每个app都是一个浏览器 2.稀烂的update管理,你的每个升级包实际都是完整的从头安装包,还都tm不删 3.这些app,把你看过的视频图片都tm cache在你的内存甚至磁盘,这样你重复浏览,就不会重复请求它们的服务器。这tm也不能说错,但是,它们经常都不好好擦干净自己的屁股 4.由于和万恶的资本和无耻的引流,你的任何app都会顺带裹挟1w个你根本不care的功能来污染你的磁盘,而原因1让这些货作恶更方便快捷还隐蔽,还tmd连带导致 2 和 3 的问题也更加严重。 |
让我举一个最根本的原因: 将一个100M内存需求的功能,通过底层算法与结构优化优化到50M,可能需要100块钱。 但一个100M内存需求的功能,通过独立构件,微服务甚至是SOA之类的松耦合架构,反而可能还要多花更多内存,但你可以提高开发速度,省100块钱。 首先内存就那么多,你不用有的是APP会用 其次你花钱替用户省内存,用户也不会感激你。 商业性质的研发也是商业活动,归根结底仍然是成本与收益问题,当当前的场景环境下成本大于收益,且即使不去做带来的风险与副作用完全可接受时,自然就没什么人愿意去做了 |
下图为原因之一 |
|
|
某项目有个数据文件,几百mb。 开始用mmap加载读写,写到一半 要我暂停,告诉我别这样搞,机器内存太小的不是我们的目标客户,要我把数据全load到内存里去。 然后启动后啥也没干,就吃了1g多内存。 |
我见过一个屌炸天的记录日志的方法 打开日志txt文件 读取所有的文本到文件流 在文本后面追加需要记录的日志 再把文本存回txt 虽然忘记关闭文件流了, 但是这个程序过一会自动会因为其他bug崩掉, 并被另一个程序重启, 所以不会导致内存泄漏 他甚至贴心的加了个locker防止并发 我甚至觉得毫无破绽 |
高级语言 现代的很多高级语言本身就需要占用更多内存。运行时常驻内存的部分就不容忽视了,对于新增的对象也需要占用越来越多的资源。 举个Python的例子,在C层面定义一个对象时,是需要一个struct的。一个早期版本Python定义对象的例子:
可见单单是一个空的对象都需要很多字段占用很多内存。而一个常见动态语言的运行时即便是刚启动就会有数千甚至上万个对象了。 我这里只是用Python举个例子,Java、JavaScript之类的语言有一个算一个,都这德行。 框架的浪费 很多编程框架也会导致内存的占用。比如Web开发框架就需要把URL与处理函数的映射记录下来。每个请求也需要很多个对象来记录Context、Request、Response等等。 需要连接数据库的应用,数据库连接池也需要记录每个连接的状态,并发控制。对于发出的请求和收到的响应,逐层进行协议组装和协议解析时也需要占用内存。 游戏/GUI框架方面,每个可显示对象的全部信息也都是要记录的。 空间换时间 一些编程语言、框架、应用,会通过占用更多内存来换取更快的运行速度。 以我熟悉的Python为例。一些常见的对象,比如数字对象是会预先创建的。距离比如256以下的整数。这样在应用需要使用数字对象时,就可以直接引用该对象,而非临时申请内存,释放时也不会把引用计数减到0而回收,而只是归还给系统继续保留该对象。这样对于频繁的要被引用的对象,就无需频繁的使用内存申请和释放流程,使得系统运行速度更快。 缓存 缓存一般是指从网络或文件载入的内容,因为访问速度较慢,所以缓存到内存里就能获得更好的性能。尤其是涉及网络的资源,载入过程是很慢的,能缓存起来就能获得良好的性能和体验。 典型如Web开发中各种JS和CSS文件,常用的小图标等等。浏览器按标准就会有缓存到本地的行为,同时也会把当时正在使用的资源放到内存里。 不幸的趋势 这些占用更多内存的行为,有些是必要的,有些能换来更快的速度也是值得的。但一些框架和语言层级对内存的浪费则是越发让人难以接受。而且很不幸,这是个大的趋势。越来越多的系统在设计时,就没有把内存占用当成个值得关注的问题。 过去的几年里,我的电脑占用内存最多的就是Chrome浏览器。尽管电脑的内存一路从十年前的4G升级到现在的32G,但多出的内存,总是能被Chrome给浪费掉。一个简单的纯文字网页都能占用几十MB,稍复杂的富客户端网页则动则500MB以上,甚至一些可以持续加载内容的页面会占用几个GB的内存。 过去几年因为多种因素,很多游戏玩家买不到新款显卡,倒逼游戏开发商不得不确保游戏可以在1060级别的显卡上也能流畅运行。我是很希望未来能出现个有内存约束的环境,来迫使软件开发商能够重新重视起来内存占用问题。 我的内存不是用来给你浪费的。 |
别客气 用吧 |
|
|
我现在觉得电脑比手机还好点了 手机那个app体积真的是惨绝人寰 尤其是头条系的app,简直不要脸 一个看番茄小说,一个悟空浏览器,一个头条新闻.一个西瓜视频 这种破单一功能的app干什么安装完就要占1个多G.用一段时间就要上2个g |
我在这里说一下手机的内存消耗问题。 |
|
手机内存 这是硬件厂商,软件开发商和消费者三方达成的一种循环所致。 硬件厂商告诉消费者,内存越大越好,长此以往消费者信以为真。软件开发商从中获利,再也不用花费额外的人力财力去精简代码。硬件厂商与软件开发商都在偷着乐,硬件厂商卖出了高配设备,软件开发商节省了代码精简优化成本。消费者一开始觉得很 Nice,就要大内存,到了后期发现这内存又不够用了。 所以这问题出在哪了呢?是消费者被硬件厂商和软件开发商联合起来坑了吗?消费者能去倒逼着软件开发商去精简优化代码,提高软件运行效率吗? 软件对内存的消耗越来越大,消费者自己不能说没有责任。事实上不明白其中利益关系的消费者恰恰还是更大内存的坚定支持者。在手机领域但凡带上 iPhone,就有很多消费者认为更大的内存和更大的存储就是好。但凡与 iPhone 无关,消费者又把矛头指向了微信,认为微信摆烂,大量占据内存和存储空间。更大的内存确实领先了 iPhone ,却也宠坏了软件开发商。 目前的状况是,即便消费者已经意识到更大的内存的让更多的软件开发商有了摆烂的空间,却也无能为力。因为消费者倒逼硬件厂商和软件开发商的办法就是去抵制这种趋势,拒绝购买大内存的产品,拒绝使用滥用内存的软件。但现实情况却是,硬件厂商有无数种方法说服消费者去使用更大内存的设备,软件开发商举双手赞成硬件厂商的这一举措,只有消费者无力抵抗。 |
就是叠甲的结果。。。 本来Windows有低层接口,就是各种SDK接口。但是不好用。于是微软开发了MFC,做了一层封装。后来,大家反应MFC用起来也费劲。于是微软又搞了.net框架。 但是后来出现了手机。为了让一套代码在手机和电脑上都能跑。于是又有人开发了一些跨平台框架。。 就这样,一层层的封装。每一层封装都是大量的代码和逻辑。都需要内存。。 |
其实,不用纠结具体是什么软件。 因为现在的软件是按照你有16G内存设计的,你可以看到90%以上的新电脑搭载的都是16G内存。 所以搭载8G内存的电脑,无论如何,都不会用起来很舒服。 你花无数的折腾去优化系统,去精简软件,去研究谁占了内存。。。对个人来说,总是比不上直接升级内存要来得实在。——因为这些事情原本是该系统开发者去做的,而他们就是按照16G内存优化的。 至于8G内存的款式为什么要卖出来?——那是为了差异化啊,降低价格同时降低用户体验。 如果低价的款式用户体验跟高价款式差不多,那高价款式卖给谁呢?所以,显然从任何方面来说,产商都没动力去把8G内存的体验优化得跟16G内存体验一致。——除非,做操作系统的跟做电脑的不是同一家。 |
因为省内存的编程语言都很难用 |
软件开发是基于测试用电脑的。 如果在软件开发的时候,开发者手里只有一台2k内存的开发机(红白机) 他会努力让程序用2k内存就跑起来,并达到用户的需求。 如果他有64M内存(office95),他会考虑操作系统,常用程序加起来,不能用太多内存导致缓慢。 所以,word就要写程序控制到10M内存以内。 如果他开发的时候,就有16G内存,32G内存。 那么,他做一个简单的媒体播放器,也不介意用掉2G内存。 类似的还有处理器。 在处理器性能弱的开发机上,要努力优化程序,降低资源需求,用高效率工具。 而在处理器强大的时代,开发工具都是浪费资源的,写程序就更浪费了。 对电脑来说,因为windows的兼容性比较好,其实问题不太大。 对于没有联网需求,不强迫你更新(微信)的程序。 你用老程序即可。 office97精简版可以流畅运行在win10上,增加一个兼容包,就可以开docx格式的文件。 你就是办公打字,制作65536行以下的表格,可以秒开。 简单处理图片,不用高级功能,你可以用ps cs4 cs3甚至6.0,4.0。 听歌,foobar0.91就够了。 |
两个主要原因 第一个,web化,什么都变成网站和浏览器,浏览器是吃资源的大户,更别说有些时候,你本机上的ui,还要给你启动一个本机网页服务器来伺候,本来你的机器只是个客户端,结果还要启动个服务器,你说内存消耗大不大? 第二个,脚本化,随便一个垃圾脚本,都是吃资源的大户,解释执行,动态类型,哪个不吃资源? 你电脑上这种破烂玩意越多,你的内存就越不够用 这就是为什么,像java这种工具,会赢得真正用户好感的原因,因为java也是从吃资源开始,但是后续的优化方向,几乎都在减少内存的占用,无论是虚拟线程还是值类型还是aot提前编译,这些都会对内存占用起到一定的优化效果,而且这是真正java开发者和社区努力的方向 你看,这些人才是真技术,脚本和web那些,只是挂着技术名字在那边骗钱的玩意 不仅java在这么努力,苹果和Google也都在朝着这个方向努力,像java最早aot的例子就是安卓上的art,苹果则干脆禁止没有aot的app上架,它给出的原因就是,真正用心做app的开发者,不希望他们的作品,跟粗制滥造的作品摆在一起,请你拿出诚意来,当然这里面有一些灰色地带,比如苹果可能会对一些大户开绿灯,但是整体趋势是这个方向 这些才是真技术 至于什么web,脚本,那些家伙,真的是越看越让人恶心和反胃,这种人还挺多,毕竟为了survive,这些人啥事都干得出来,能做的就是跟这些家伙划清界限,走开走开 最近一个例子就是,stable diffusion,python写的,界面是webui,我的破mac跑这个直接死机了,正常配置应该是去买一个一万多块钱的4090之类的来跑,贵啊 后来肿么办呢? 感谢苹果的努力,core ml,性能大幅提升,对内存和cpu/gpu要求下降,同时又有社区制作mochi diffusion,使得我现在就可以用mac mini 8g m1在用ai生成图片,开心得不要不要的 人生苦短,远离那些给别人喂翔的开发者 |
利益相关:喜欢狂吃内存的开发者 我开发的习惯就是,只要没有内存泄漏,那么倾尽一切代价尽可能通过多用内存来提速 我之前写一个联网安装的安装器,正常人可能会写先下载压缩包到临时目录再解压,我直接下到内存,文件不落地直接解压,哪怕这个压缩包高达20g(我真测试过,消耗22g内存就能不落地解压这个20g的压缩包,不会崩) 为什么这么做有两个原因,第一,内存快,相比先下载到临时目录,20g的压缩包下载解压整体能快大约四分钟(pcie4.0固态对比),第二,固态寿命比内存短,文件不落地少磨损固态20g寿命 所以只要不滥用,不内存泄漏,多用内存来换速度和减少硬盘磨损完全是可以的 至于内存不够文件不落地解压的用户么,让他们开个32g的页面文件就是了 只要不是内存泄漏,那么一切内存不足产生的报错我一律标记won't fix |
win32时代,一个软件可以只依赖3个dll(user32.dll kernel32.dll gdi32.dll) .net时代,一开始需要依赖一个20M左右的.net framework后来发展到50多兆。系统装个.net就好了。 再后来的web壳时代每个程序都自带一个上百兆的浏览器,以及用npm下载的大量代码…… |
macOS上这些什么Helper (GPU)的无一例外都表明程序是基于Electron框架的… 也就是说它其实是个浏览器。 而因为网页标准的高度复杂化,浏览器普遍需要更多更复杂的逻辑去做呈现,进而消耗更多的系统资源。 |
首先,现在不少应用都是基于基于chrome的electron框架开发的(此处建议注意断句),而chrome嘛,本来就是内存条吞噬者了。。。 其次,国内很多开发商由于各种原因(比如屎山代码和体制问题),并不能对软件进行优化(都觉得能用就行,结果就是能用就行,彻底甩锅给用户),可以横向对比一些导航软件的标准版和为部分品牌手机特别准备的版本。 最关键的是:从上到下,大都没人在乎,所以哪怕有清醒的少数也没啥用。 |
作为期望 Web 技术将来作为一个操作系统级别的应用平台的支持者,也是这一块的力行者,我想讲下这个问题。这个问题,可以从技术角度,分两块 磁盘空间很多人吐槽目前 electron / libcef / chromium二开 的解决方案,每个应用都带了一个浏览器 这个现象,主要原因就是基于 Web 的解决方案,没有一个绝对掌控去为这个目标努力导致的 我们可以通过分析 Qt 和 Java 两个解决方案得到这个结论 大部分 Qt 程序,都不会依赖系统去安装什么版本的 Qt 库,而是完全自带需要的 dll / so大部分 Java 程序,都支持用系统全局安装的 jre 去运行,而不需要每个程序都自带 jre正说 为什么?Qt 不能全局安装吗?其实是因为其作为 C++ 解决方案,二进制兼容性很难做好,光二进制就有 mingw / cygwin / msvc 三种有差异的标准底层依赖。而 Qt 公司又无力让这样的环境标准化,所以逼不得已每个程序都得自带 qt 的二进制库 而 Java 这一块就做得比较好,其一是没有 C++ 那么复杂的二进制标准库问题,基本上每个操作系统都只有一套运行时标准(注意是标准,不是实现),其二是它向下兼容做得很好,所以用 Java 发布的程序,信任系统内提供的 jre 是可以得到很好的收益的 反说 但是,仍然有不少 Java 程序是自带 jre 的(如 eclipse),因为就算依赖全局安装的 jre 性价比不错,但仍然会产生一些可能的冲突引发问题,比如用 java 11 开发的程序,系统里可能只装了 java 8 规范的 jre。所以干脆还是自带 jre 得了 另外再看 Qt 这边,就算很努力地去做了全局依赖的标准化,顶多也就干成 vcredist 和 .net 的样子 |
|
vcredist 多个版本(图侵删) |
|
.net 2.0/3.0/4.7(图侵删) 因为极难实现向上兼容的原因(低版本支持高版本的功能),还是得全局安装多个版本 总结 所以无论 Qt / Java / Web 目前都存在每个 App 不得不重复携带重复运行时的问题 这个问题,各家也有在积极解决 Qt 据说在更细地拆分里面的库,但是由于 Qt 商业化越来越重,最近很少关注这个解决方案了Java 这块大家去看 @圆胖肿 的时间线,他讲得很通俗Web 这块只看到微软 webview2 有这个意思,但是成不成难讲,到现在只支持 WindowsWeb 这块国内大神 @龙泉寺扫地僧 在做一款精简的方案,最小只需要几 M 运行时即可实现基于 Web 技术的 App,但是功能有所裁剪,如果刚好用到了那些被裁剪的 V8(JIT) / WebGL / WebGPU / WebRTC / WebAssembly 等能力,就会有所不适用 但是由于存储(DDR5 / SSD)发展的势头仍然强劲,商业上对于缩小应用体积这一点不是特别热衷,所以目前来看,短时间是难以得到进展的 我只能说,这不是解决不了的问题 内存空间很多人吐槽目前基于 Web 方案的内存占用很大 这个现象,又要分两块来说 HTML + CSS 浏览器通过解析 HTML 生成数据和视图结构,然后通过 CSS 指定其渲染行为 现代 CSS 甚至能指定具有时间信息、上下文信息的渲染行为,以及各种三维变换和像素变换 transform - CSS:层叠样式表 | MDN?developer.mozilla.org/zh-CN/docs/Web/CSS/transform |
|
mask - CSS:层叠样式表 | MDN?developer.mozilla.org/zh-CN/docs/Web/CSS/mask |
|
由于这些能力都没有经过预编译的步骤,都是动态生成的,所以运行时携带了大量信息,对内存资源的占用较大 另外就是浏览器的排版渲染这块,历史包袱极重,Chromium 这块目前可以说已经是屎山 JavaScript 语言 目前毫不夸张地说 JavaScript 是流行的通用动态类型编程语言中,执行速度最快的 而动态类型语言在某些功能开发中,效率是非常好的,且门槛也足够低,非常适合大范围使用于 短、平、快 类的功能开发中 但付出的代价就是内存占用 一是作为一个低门槛的语言,GC 是标配 那么类似 Java,需要提供给通用 GC 较大容量的缓冲区,才能很好地运行,压着需求线频繁 Full GC 效率打折太狠,这是内存占用高的一个点 二是 JIT 需要在运行的过程中 保持原有逻辑内存中存储额外信息分析原有逻辑存储多个级别的 JIT 后的机器指令机器指令本身带了很多和运行时交互的额外功能(增加程序尺寸,降低运行速度) 至于为什么,由于 JIT 是相对通用的知识,这里就不赘述了 从而导致进一步提高了内存占用 解决方案 其实,作为从业者,我很清楚上面一通分析还是后话 现在更大的问题是 App 开发者对于内存等资源的使用过于奔放,才导致动辄 1G 以上的问题 IM跨平台技术学习(九):全面解密新QQ桌面版的Electron内存优化实践-腾讯云开发者社区-腾讯云?cloud.tencent.com/developer/article/2328839 |
|
按照经验,一般一个 App 界面部分 500M 内存是足够的,不认真规划导致剧烈膨胀才是导致内存占用过大的首要原因。基于 electron 做的新版 QQ,面对大量的聊天数据渲染需求,还能做到 350M 的中位数,实属我辈楷模。 至于怎么优化内存占用,有很多资料,都是唾手可得的,主要还是商业原因,大家优化的意愿不强 再然后,才是优化 HTML + CSS 本身的占用,这个我判断只能未来业界一起精简规范,把历史包袱都丢掉才可以 或者另辟蹊径,用 canvas / webgl 做界面,这个方案可以和 natvie 直接比拼算法能力,算法做得好,内存占用少,性能好,反之。不过这种方案偏题太远 SpriteJS ~ Next - 下一代 SpriteJS?spritejs.com/#/ 构建 Flutter Web 应用?flutter.cn/docs/get-started/web |
|
MLTC:canvaskit-wasm —— 在浏览器中直接使用 skia 的能力渲染 sketch 文件146 赞同 · 17 评论文章 另外就是弱化 JavaScript 复杂的算法用 WebAssembly 实现,这些算法用 JavaScript 写起来也没开发效率优势,反而因为类型系统不完善(包括 TS)是劣势,而且对内存的可控性远低于 C++剩下的性能不敏感的逻辑,可以不开 JIT,用慢速的 JS 去运行综合以上两点降低内存占用 V8 新机制:JIT-less 模式?www.oschina.net/news/105176/v8-jitless 这也是需要付出一定开发成本的,商业原因不是所有公司都乐意 为什么不都用 Qt 因为 Qt 越来越商业化,难以成为一个普适的方案 如果不是如此,其实整个 Qt 生态会更丰富多彩的。如果哪个软件的受众特别在乎内存占用,用 Qt 其实也不错 但这涉及到人家的生存问题,我无可厚非。只是非必要不推荐罢了 另外 Qt 门槛还是比 Web 高很多,某些场景投资回报率还是比较低 为什么不用原生开发技术 门槛高,普遍来说投资回报率低,除非哪个软件希望做精品 民用领域比较少,工业软件倒是可以,但前有 Qt 为什么想不开要用原生技术做呢? 商业 回到一开始的愿景,我个人是期望未来 Web 能作为一个操作系统级别的应用平台,类似 Chrome OS 这样的定位 这样才能带动商业上的力量,使得众多 App 认真优化在这个平台上的用户体验 但是现在整个生态是分散的,比如手机上,本来可以用 Web 低成本实现的,结果都跑去做 App 了 所以目前,无论使用 Web 技术做的 App,还是移动 App,都因为商业原因,积极堆砌功能,而怠于优化内存与性能,导致大家在低性能低内存设备上的使用障碍 但不是技术路线问题! |
因为开发这些的程序员有一句名言: 内存不值钱! 简单说,就是计算机普及教育太拉夸,导致我国小白用户太多,有意或无意的对待这些产品太过宽容,过度就是纵容,这导致开发者在你的地盘(电脑)上可以肆意妄为。 作为一个程序员,我都极为反感好好一个客户端软件,它非要在里面整一个浏览器内核,好像纯客户端软件不会开发,只会搞web前端一样。那些国人开发的高星的所谓开源软件,我一看是前端技术封装的客户端,不管是不是高星,我都不太想下载。你就打开chrome浏览器,随便开几个标签页,你看看内存占用多少了吧,这东西就是个吃资源大户。拿浏览器内核去封装的客户端软件,想想就知道多么吃资源。 |
现在设计软件对内存预估标准基本就是8G,16G这种标准,这样导致开发对内存节省没太在乎,一般来说都足够现在开发,越来越复杂,但是很多都是引用各种库各种包,就是很可能开发的时候为了实现某个目的,加入了一堆不需要的东西,导致臃肿,臃肿就意味着占据磁盘空间和内存优化需要耗费时间和精力,对于开发公司来说,这都是成本,而没啥收益。大家基本都是只关注是否实现,至于需要耗损多少客户的内存,没多少人在意,毕竟客户往往也不知道这玩意耗损了多少内存,只知道是不是满足了目的。 |
国产软件几乎清一色是垃圾。没有实质性能功能差距我都是尽量用网页端。别tm污染我电脑。 别逼我升4*16G哦 |
|
|
国产一个APP就要做所有功能。一个点外卖的都要打车、短视频、购物、借钱、小游戏。 |
首先,捉到题主这枚五笔党,欢迎大家来参观。 其次,虽然好汉不提当年勇,但我还是得想个当年。那会儿,写程序,在一个内存仅8KB至24KB左右的设备上跑斗地主游戏,还要跑AI,屏幕为160*80。写个俄罗斯方块,用普通的二维数组还跑不动,最后被我优化成全用位运算解决算法问题。更有甚者,就这么个破设备,还能跑RPG游戏,大作呀。 不信?赶紧搜搜,文曲星。 CC800/880/980 PC1000/1000A/1000B/1000C/1000N/1010/2000A/2000C NC1020/2000/2600/3000 TC800/808/1000/1000S 等等等等。 要换成现在的程序员,我估计他们写不出这种游戏,因为,随便一撸,内存就爆了。 为什么?以前开发,要么用6502汇编,要么是纯C的那种代码。 现在的都是面向对象开发,一个对象本身就很大,因为要兼容很多轮子,封装类库的人通常会将可能用到的功能都封装进去,不管你是否真的能用上,只要你new出这个对象,这些用得上用不上的内容都创建了,想想一个完整的应用,需要new多少个对象,每个对象得占多少内存?这些对象里的代码利用率到底又有多高呢?也许,可能,大概,估计占用200M内存的,我们实际只能用到其中的20M吧? 我学识浅薄,不敢深究,拍砖的请轻点。 |
这可是先进的Chrome和先进的Nodejs呢。 其实就是偷懒,用人厌狗嫌的Electron给网页套了个壳。 这玩意儿是一个完整的浏览器加半个网站,占用能不大么。 |
因为现在的软件开发都是讲究快速把产品做出来,能运行就行。 谁还会有精力去仔细地考虑架构,优化内存占用这些事呢? 之前还有大佬提过,阿三的程序员在全世界的软件开发领域非常有名,人家在培训中就是这么在干的。 你有个功能需要存储500个数据的参数,中国的程序员可能还会使用链表功能,指针指来指去,处理指针的bug玩过C++的人都会明白有多痛苦。 而阿三的程序员直接就是建一个500个数据的数组,方便快捷。至于内存占用?谁管那些!内存不够这不是硬件工程师该考虑的问题吗?关软件工程师个毛线事? 所以,最终就是现在这个样子了 |
说一个简单的原因,就是精炼的程序(或者说比较小的程序)对开发人员太高。而一般的开发人员很难达到这要求。而现在由于硬件资源的极大富裕,所以通过消耗硬件资源的方式掩盖自身软件设计能力的不足就成为了一种合理的工作方式。 说几个事情吧。 1、我原来最早用dos的时候,只有640K。操作系统需要占100多内存,汉字系统需要占200多,最后自己可以玩的空间就剩下200,由于需要连接函数库,如果上来上来就全部加载,就超了,没有办法,只能将程序分割,需要那部分,就上载那部分。当时真是1k、1k空间扣,挺有意思的,后来,计算机内存大了,就再没有这么干过。 2、我后来遇到一个项目,是做用c语言做程控机的控制,当时项目组有四个成员,我们当时编写的程序遇到一个问题,就是时间效率问题,说简单点就是我们的程序速度满足不了硬件的需求,后来老大来看一下我们的程序,告诉我们,我们的程序没有问题,但因为需要大量的字符操作,调用了系统库,而系统库的函数有很多的合法性检查,而其实这些检查是不需要的(我们当时的经验可以保证软件的质量)。于是老大将函数库的合法性检查全部去掉,于是,我们的程序通过了。 其实,软件开发是一个有意思的事情,开始的时候,即使一个简单的功能都需要开发人员自己编写。于是你看到很多人编写了很多相同的功能,这样做,最大的问题一个是浪费资源,第二是软件质量无法保证。 于是人们想出了函数库的概念,将很多常用的功能编写成函数,这样大家调用一个固定的函数就可以完成相应的功能。极大地提高了开发效率和软件质量。 但问题是为了保证质量,这些通用功能的函数,需要做很多数据合法性检验,而这些检验往往是多层建议,而对于一个比较好的程序员,这些问题其实是可以避免的。于是这些检验代码会浪费很多资源(包括空间和计算时间)。 而这些函数为了便于管理,往往是很多同类型函数放在一个地方,在系统加载的时候,这些函数需要一起加载,即使你只使用了一个函数,也需要加载一个库,这就很占空间。 当然,还有其他问题,比如空间资源释放问题,原来资源释放是需要开发人员手工释放,但管理起来的确很麻烦,后来有了自动释放机制,但关键是这种机制是否完善,很多时候是有漏洞的,于是很多无用空间一直没有释放。 作为开发人员,如果想学好技术,其实应该保存一个编写精干程序的习惯,也就是程序尽量小,在这个过程中会遇到很多技术问题,但这些东西搞明白,其实技术水平会提高很快。 但在工程和项目管理角度讲,需要进行平衡,如果时间富裕,可以做精干程序,如时间不富裕,还是先完成任务为先 |
以前公司时流传的一个笑话,具体数字未必对。我们有一个功能是下载软件升级。印度工程师一口气申请了20M内存,单元测试通过,版本发布就挂了。为啥?我们的嵌入式系统,总共16M内存。 领导评论,应该是做Java的 |
主要是硬件系统越来越强大,内存也越来越大越来越便宜。 用户对一个软件的内存占用也越来越不敏感。 软件开发者把精力放在本地软件性能优化下投入产出比并不高。用户不会因为少占用几G内存就选择你,并且把大量内容缓存到内存中,用户使用体验会更流畅。你不占用,其他软件也会占用。 相反公有云服务器端的软件性能优化大家都无所不用其极,因为服务的用户多,投入产品比高,少占用点算力内存,同样性能的服务器能支持的用户数就更多,系统也更稳定,也更省钱。 |
|
[收藏本文] 【下载本文】 |
上一篇文章 查看所有文章 |
|
|
娱乐生活:
电影票房
娱乐圈
娱乐
弱智
火研
中华城市
印度
仙家
六爻
佛门
风水
古钱币交流专用
钓鱼
双色球
航空母舰
网球
乒乓球
中国女排
足球
nba
中超
跑步
象棋
体操
戒色
上海男科
80后
足球: 曼城 利物浦队 托特纳姆热刺 皇家马德里 尤文图斯 罗马 拉齐奥 米兰 里昂 巴黎圣日尔曼 曼联 |
网站联系: qq:121756557 email:121756557@qq.com 知识库 |