程序中节省几 kB 的内存有必要吗?

简介: 程序中节省几 kB 的内存有必要吗?

大家好,我是董董灿。
最近有个人问,程序中节省几 kB 的内存有必要吗?
我在写程序的时候,更改一个判断语句,会提升几毫秒,换一种方法会节省几KB,这些有必要吗?

看到这个问题,我的第一反应是却是一个定律——安迪-比尔定律。

问题的回答

安迪-比尔定理 (Andy and Bill’s Law)是对IT产业中软件和硬件升级换代关系的一个概括。

原话是 “Andy gives, Bill takes away.(安迪提供什么,比尔拿走什么。)” 安迪指英特尔前CEO安迪·格鲁夫,比尔指微软前任CEO比尔·盖茨,这句话的意思是,硬件提高的性能,很快被软件消耗掉了。

你有没有觉得1年前买的手机,在更新了几代系统或者软件后,突然变的卡的要死。比如手机的王者荣耀越更新内存占用越大。
这背后都是安迪比尔定律在搞事情!!
硬件和软件的关系,就像是一对欢喜冤家。硬件的升级会导致软件开发越来越随意,但同时,由于软件开发的随意,会反过来逼迫硬件的进一步升级。

举个 苹果手机 v.s. 王者荣耀 的例子

在苹果7刚出的时候,手机运存8个GB,这时候王者荣耀出了某个版本,就叫它A版本吧,这个时候,A版本安装完,运行游戏要占3GB。我们拿着苹果7玩的很舒适,也不卡,因为运存8GB还很大。
这个时候,王者荣耀项目组A程序猿:“我们要增加新功能,添加新特性,要不要把没用的代码都删了啊?”
王者荣耀项目组B程序猿:“不用,现在的手机都8G运存,至少128G内存,够使的,我们直接加特性就行,再说了,你把原来无用代码删了,不怕出bug啊。”
于是,王者荣耀经过几个大小版本的迭代,变成了B版本,手机一更新,安装完占10GB,运行时占6GB。
完了,苹果7有点吃不消了,带不动了!怎么办,我还想玩王者荣耀,换手机。这时候苹果8也出了,16G运存,够使了!!!
苹果7手机的硬件的性能,就这么被王者荣耀的不断更新给吃掉了。
Andy gives, Bill takes away!

为什么软件可以吃掉硬件的性能

除了软件不断更新,添加新的特性之外,更重要的是,现在的应用程序开发者,几乎很难再有节省几KB 内存的意识了。
我做过芯片开发,要知道,芯片的片上存储是很珍贵的,多出几十KB的存储,就会有意想不到的系统性能提升。
而做应用开发,几乎不会注意到这么底层的存储资源,因为现在电脑、手机的存储都动辄几个GB 的存储,比 KB 大好几个数量级!
所以说,几 KB 的内存节省,看你做什么级别的开发。
如果嵌入式或芯片开发,那么完全有必要节省!
如果像应用层比如手机APP开发,确实必要性不大,虽然这么说不太好,但是,正是软件的无节制生长,才会倒逼硬件进一步研发更新一代的架构和存储。

最后说一个例子

超级玛丽这款游戏,我们玩了很多年,游戏中那么多关卡,那么丰富的剧情,丰富的配图,丰富的配乐,但是你能想象,这款游戏的总大小才64KB么?
64KB包含了游戏所有的代码、图形和音乐!
image.png

这主要是因为,在超级玛丽那个年代,芯片上的硬件资源少的可怜,游戏开发者为了节省内存,进行了大量的代码优化和图片复用优化。

你所看到的图片中的障碍物,其实都是多个小的正方形图片的拼接,而在内存中,只存储了一个!!

相关文章
|
3月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
220 6
|
2月前
|
NoSQL 测试技术
内存程序崩溃
【10月更文挑战第13天】
146 62
|
23天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
1月前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
2月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
157 21
|
3月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
3月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
4月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
4月前
|
监控 Java API
如何从 Java 程序中查找内存使用情况
【8月更文挑战第22天】
308 0
|
5月前
|
算法 Java Serverless
Java演进问题之Java程序占用的内存经常比实际应用运行产生的对象占用要多如何解决
Java演进问题之Java程序占用的内存经常比实际应用运行产生的对象占用要多如何解决