软件会使用内存,不会有太大的惊喜,但与程序的大小相比,如何将这种使用率降至最低。
我认为最好的例子是Firefox。有些用户已经体验过,有些用户没有,但可以肯定地说,所有以前版本的Firefox使用的内存比当前版本多得多。然而,功能扩展和选项被添加。 我希望内存使用量可以作为额外的选项,并添加这些内容。
换句话说,必须有一些方法可以确保你的程序不会耗尽计算机的内存。
所以,我把这变成了一个“最佳实践”的问题,问你所有人你的小技巧和调整是什么让你的程序做它做的事情,用你通常认为的CPU少。而且,最肯定会避免的是什么。
这里有一个小问题:我在一本关于C#的书中遇到了一些问题。 显然,在编写枚举时,可以设置此枚举的索引大小。 对于大的Enum,你应该让编译器处理它我想,但对于只有2或3项的枚举,你可以这样做:
public enum HTMLTYPE : sbyte
{
HTML401,XHTML10,XHTML11
}
对于那些不知道原因的人来说,显然为任何Enum的索引保留的内存量会自动设置为C#中的整数。换句话说,将保留该数量的内存。但是当你在Enum中定义这么少的东西时,整数就是浪费空间。 该书声称这可以减少程序使用的内存量。我想知道这是否属实。
编辑:的确,它应该是记忆,让我感到难过。更改了所有条目。答案 0 :(得分:8)
首先,你可能会混淆CPU和RAM(也就是内存)。 CPU是处理器,即根据您的数据运行代码。内存是存储的代码和数据的地方。
实际上应该避免使用这个枚举技巧。首先,sbyte
不符合CLS。然后它可以限制未来的扩张。总是存在这样的事实:CPU总是使用整个字(在32位体系结构中int
和在64位体系结构中使用long
。你失去了所有这些,并获得了什么收益?你的内存占用了几个字节。
更重要的是,请遵循以下明智的话:过早优化是万恶之源。
这意味着,只有在真正需要时才进行优化。先测量一下。你很可能意识到这不是那个需要削减的枚举中的三个字节。
答案 1 :(得分:5)
一种技巧是使用lazy initialization仅在您需要时创建对象。
此外,请务必将不再需要的对象置于(或设置为null),以便对它们进行垃圾回收。
答案 2 :(得分:2)
这是事实并非如此。使用int-processor背后有一个理由自然地使用它(除了运行x64 Windows时,更自然的是Int64)。这是因为在CPU中有4个32位长的寄存器(或x64模式下的64位)。
此外,让我们面对现实:.NET在内存和CPU方面都不是很高效。有些做法不会出现重大错误(比如循环中的字符串连接而不是使用StringBuilder),但枚举从4个字节减少到1个字节是不值得的。
答案 3 :(得分:2)
节省内存的最佳方法是首先编写一个代码清理方式,以便您可以在其中查看应用程序的设计。
然后制作一个针对内存进行调整的新版本代码。通过这种方式,您可以确保将来的版本不适用于混淆代码。
是的,更好的记忆和CPU会更少,你会想到这样的优化。
答案 4 :(得分:2)
在优化方面,通常最好首先关注算法设计。如果仍然没有达到你想要的性能,那么就是时候弄清微优化了。
免责声明:优化内存使用可能并不总是一件好事。不幸的是,很多时候你必须决定是否优化时间(CPU使用率)或空间(RAM或磁盘空间)。虽然你有时可以吃蛋糕并且吃它,但并不总是这么简单。
这里有一个小问题:我在一本关于C#的书中遇到了一些问题。显然,在编写枚举时,可以设置此枚举的索引大小。对于大的Enum,你应该让编译器处理它我想,但对于只有2或3项的枚举,你可以这样做:
...
对于那些不知道原因的人来说,显然为任何Enum的索引保留的内存量会自动设置为C#中的整数。换句话说,将保留该数量的内存。但是当你在Enum中定义这么少的东西时,整数就是浪费空间。该书声称这可以减少程序使用的内存量。我想知道这是否属实。
我对此并不是100%肯定,但这可能不一定是真的。事实上,如果您使用Mono并在其他系统上部署此应用程序,那么可能不是。原因是不同的操作系统和处理器具有不同的存储器对齐要求。因此,即使你将它声明为sbyte,它也可能被强制转换为32位或64位整数,无论如何它实际进入内存时(OS X对内存对齐特别挑剔)。
现在,我完全可以忽略这一点,在这种情况下,本书可能完全正确。但我的观点更多地是说“它比这更复杂”,并指出这种优化可能无法移植到其他平台(不同的操作系统,处理器和编程语言)。
答案 5 :(得分:2)
所有这些都是解决内存问题的良好算法方法,但在实践中,您还希望通过分析器运行代码,以查看内存和CPU资源的占用情况。
答案 6 :(得分:2)
有一本很好的在线书籍: