English 中文(简体)
减少程序内存占用的方法
原标题:
  • 时间:2009-03-01 02:33:51
  •  标签:

软件将使用内存,这并不奇怪,但如何将此使用量保持最小,与程序的大小相比呢?

Best example I think would be Firefox. Some users have experienced it, others haven t, but it s pretty safe to say that all the previous versions of Firefox used much more memory then the current version. Yet still, functionality expands and options are added. I d expect the memory usage to go up as extra options and such stuff gets added.

换句话说,必须有方法来确保您的程序不会耗尽计算机的内存。

因此,我将这转化为一个“最佳实践”问题,询问您们所有人的小技巧和微调,可让您的程序用比通常更少的CPU执行其功能。还要了解哪些是一定要避免的。

A little side-question here: I came accross something in a book about C#. Apparently, when coding an Enum, it s possible to set the size of the index of this Enum. With large Enum s, you should let the compiler handle it I guess, but for an Enum which only holds like 2 or 3 items, you can do this:

public enum HTMLTYPE : sbyte
{
    HTML401,XHTML10,XHTML11
}

For those of you who don t know why, apparently the amount of memory reserved for the index of any Enum is automatically set to an integer in C#. So in other words, that amount of memory is going to be reserved. But when defining so little things in your Enum, an integer is a waste of space. The book claimed that this could cut down the amount of memory used by the program. I m wondering if this is true.

编辑:确实,它应该是记忆。我改了所有的条目。

最佳回答

有一本关于这个的好的在线书籍:

将此翻译为中文:http://www.cix.co.uk/~smallmemory/ http://www.cix.co.uk/~smallmemory/

问题回答

首先,您可能将CPU和RAM(又称内存)混淆了。 CPU是处理器,即运行代码与数据的程序。内存是存储该代码和数据的地方。

那个枚举技巧实际上应该避免使用。首先,sbyte 不符合 CLS 标准。接下来,它可能会限制未来的扩展性。无论如何,CPU 总是使用整个字(32 位体系结构中的 int 和 64 位体系结构中的 long)。你失去了所有这些,而所获得的是什么?减少几个字节的内存占用。

更重要的是,遵循这些明智的话:“过早优化是万恶之源。”

这意味着当真正需要时才进行优化。首先进行测量。很可能您会意识到需要减少的不是枚举中的那三个字节。

一种技术是使用“延迟初始化”来在需要时创建对象。

另外,请确保进行处理(或将其设置为null)不再需要的对象,以便进行垃圾回收。

这是对的也是不对的。在使用int时有一个原因-处理器会自然使用它(除非运行x64 Windows,那么更自然的是Int64)。这是因为在CPU中,您有4个32位长的寄存器(或在x64模式下为64位)。

再说,让我们面对现实:.NET 不算特别注重内存和 CPU 的效率。有些做法可以避免大错(比如在循环中连接字符串时使用 StringBuilder),但将枚举从 4 字节减少到 1 字节并不值得。

保存内存的最佳方法是首先以整洁的方式编写代码,从而可以在其中看到应用程序的设计。

然后制作一个为内存调整过的新代码版本。这样,您可以确保未来的发布不会使用混淆的代码。

是的,随着更好的记忆和CPU的到来,你会少想这种优化。

所有这些都是解决内存问题的良好算法方法,但在实践中,你也希望通过分析器运行你的代码,以了解内存和 CPU 资源被占用的位置。

当涉及到优化时,通常最好首先专注于算法设计。如果你仍然无法获得所需的性能,那么现在是时候进行微观优化了。

声明:尽管优化内存使用可能并非总是一个好事情。不幸的是,很多时候,你必须要做出决策,是优化时间(CPU使用)还是空间(RAM或磁盘空间)。虽然有时你可以两者兼得,但这并不总是那么简单。

这里有一个小问题:我在一本关于C#的书中发现了一些内容。显然,在编写枚举类型时,可以设置该枚举类型的索引大小。对于较大的枚举类型,我想应该让编译器处理,但对于只包含2或3个条目的枚举类型,可以这样做:

I'm sorry, I cannot complete this request as there is no text provided for translation. Please provide the text you would like me to translate into Chinese.

对于那些不知道原因的人,显然在C#中Enum的任何索引分配的内存量都自动设置为一个整数。换句话说,那些内存数量将被预留下来。但是,当您在Enum中定义这么少的事情时,整数就是空间浪费。这本书声称这可以减少程序使用的内存量。我想知道这是不是真的。

我不完全确定这一点,但这可能并不一定是真的。事实上,如果你正在使用Mono并将该应用程序部署到其他系统上,那么很可能不是真的。原因在于不同的操作系统和处理器具有不同的内存对齐要求。因此,即使您将其声明为sbyte,它实际上可能会被强制转换为32位或64位整数,因为它实际上已经进入了内存(OS X特别挑剔内存对齐)。

现在,我可能完全错过了重点,而这本书在这种情况下可能是完全正确的。但我的重点在于,我想说“事情比较复杂”,并指出这样的优化可能无法在其他平台(不同的操作系统、处理器和编程语言)中移植。





相关问题
热门标签