鉴于以下枚举:
public enum Operations_PerHourType : byte
{
Holes = 1,
Pieces = 2,
Sheets = 3,
Strips = 4,
Studs = 5
}
Run Code Online (Sandbox Code Playgroud)
当我运行Microsoft代码分析工具时,它告诉我:
CA1028:Microsoft.Design:如果可能,请创建基础类型"Enums.Operations_PerHourType"System.Int32而不是"byte".
它永远不会超过几个可能的值,所以我将其声明为一个字节.他们为什么建议使用int32?未来可扩展性的更多价值?或者是否有性能提升?
Jir*_*ika 24
在某些特定情况下,缩小底层类型会带来一些优势,例如与非托管代码接口时性能相关或强制特定内存布局.
考虑这个样本:
using System;
public enum Operations_PerHourType // : byte
{
Holes = 1,
Pieces = 2,
Sheets = 3,
Strips = 4,
Studs = 5
}
class Program
{
static void Main()
{
long before = GC.GetTotalMemory(false);
var enums = new Operations_PerHourType[10000];
long after = GC.GetTotalMemory(false);
Console.WriteLine(after - before);
// output (byte): 12218 (I'm using Mono 2.8)
// output (Int32): 40960
}
}
Run Code Online (Sandbox Code Playgroud)
此代码占用大约40 KB的堆.现在指定(取消注释)基础类型byte并重新编译.哇.突然间我们只需要大约10 KB.
像这样压缩存储器有时可能使程序变慢,而不是更快,这取决于特定的访问模式和数据大小.除了进行一些测量并尝试推广到其他可能的情况之外,没有办法确定.较小数据的顺序遍历通常更快.
然而,养成一种习惯,只是因为它通常是可能的,有时是至关重要的,指定窄类型,这不是一个好主意.由于周围更广泛的数据类型的内存对齐,内存节省很少实现.由于屏蔽填充字节所需的附加指令,性能要么相同要么稍差.
正如另一个答案已经说得好,请按照Int32运行时优化的人群,直到您必须开始分析和解决应用程序中的实际内存占用.
kem*_*002 21
根据文档,使用字节而不是INT32没有性能提升.除非有理由这样做,否则他们建议不要更改它.根本的想法是,.NET在许多情况下都针对使用INT32进行了优化,并且出于某种原因他们选择了枚举.你没有在你的场景中通过改变它获得任何东西,所以为什么要这么麻烦.
http://msdn.microsoft.com/en-us/library/ms182147.aspx
这也讨论了如何优化.NET以使用32位整数:.NET Optimized Int32
| 归档时间: |
|
| 查看次数: |
4208 次 |
| 最近记录: |