问题1:  
         枚举类型的基类型可以选择多种类型。
         如果我选择 byte 或者 int 作为一个枚举类型的基类型,
     在内存占用和运算性能上有什么区别?问题2:
        byte, sbyte, short, ushort, int, uint, long, ulong 
    以上几个值类型的运算性能次序究竟是怎样的?
        decimal 与 float, double 之间相比,情况又如何?
        decimal 与 int, long 之间相比,情况又如何?比较时,不要管溢出的问题,总是假设一个值可以适用于比较的类型。提出这些初级问题,只是因为最近在研究一个算法,对如何采用合适的值类型没有太大把握。
我希望正确的值类型选择对提升算法的速度有效果。烦请各位大侠赐教。

解决方案 »

  1.   

    数据类型的范围越窄,占用的内存越少, 比如 short 就比 int 少在不会溢出,并且精度许可的情况下, 尽量采用 最小的 类型
      

  2.   

    据说int性能最好,关注此问题
      

  3.   

    据网上传,
    32位的处理器,
    所以用4个字节即32位的数据最快,.Net中就是int型了。
      

  4.   

    不用比较了,INT最快,也就是VB里面的LONG,这是32位系统的默认类型,最快!
      

  5.   

    是啊,不用比较,估计内部计算时都是转化为32Bits的Int来计算的。
      

  6.   

    应该是int最快,因为现在CPU是32位的,int刚好就是32位的
    做个简单的测试程序实际测试一下来得最权威了,呵呵
      

  7.   

    理论上,add ah,5 和 add ax,5 和 add eax,5
    您说CPU周期那个快?
      

  8.   

    我赌 add eax,5 快,呵呵
      

  9.   

    decimal 与浮点数的运算处理据说是不一样的,究竟何者更合适,我也说不清楚。(不考虑实际数值的大小)采用字节长度较小的类型如 byte、short 是不是一定就比 int 更小占内存空间?以前我曾有一个习惯,喜欢把一个枚举类型的基类型设为 byte,希望能更小地占用内存空间。
    public enum MyEnum : byte
    {
        ...
    }
    我不知道事实上是不是和我想的一样。当一个算法的运算时间可能长达几十分钟时,我想我不得不慎重对待值类型的选取。在这方面,我也找不到一份有价值的使用建议或者白皮书什么的。
    我想 C# 提供更种不同的值类型,除了值边界检查,肯定还有其他的用意。
    可惜关注此类问题的人实在太少,因为对于通常的开发确实不必在这方面太较真。希望更多高手指点一下迷津。
      

  10.   

    所有数据是转换成2进制进行运算的,不同的编译器采用的编码标准不统一,各种类型之间的性能也可能有所变化。一般情况下浮点数中,double转换为2进制占用字节最多,速度最慢。decimal根据只有根据其二进制转换原理才可以知道其运算性能。
    整型中应该是字节数越少运算速度越快。但是如果数值过大,存储字节多的也可能更快
      

  11.   

    测一下,生成10亿byte或int 进行比较
      

  12.   

    枚举只支持基元类型,都是CLR可以直接支持的基元类型。public enum MyEnum : Int32
    {
    .....
    }
    具说这样也会报错 ,
      性能差别实在是微呼其微,没必要在这里计较 只要不把他装箱折箱,性能影响不大
     因为枚举是值类型
    public enum MyEnum : byte
    {
       sss=0x01,
      ......
    } 编译后大约是这样了:struct MyEnum :System.Enum
    {
     public const MyEnum sss=(MyEnum)Ox01;
    ......
    }
      

  13.   

    参考Writing Faster Managed Code: Know What Things Cost
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/fastmanagedcode.asp
      

  14.   

    编译后似乎直接是public const MyEnum sss= Ox01;
    ...
      

  15.   

    思归老大提供的链接真的很有价值,并且还找到了一些其他相关的好文章。
    这两天虽说还不能得空,但也必须开始好好阅读这些文章。TO 速马,编译后固然如此,但在 32 位计算机上,byte 类型是否真能少占内存。
    不好意思,我真有点不大清楚值类型在堆栈上的内存分配和管理方面的实际细节。
      

  16.   

    使用 generics 么!这么简单的问题让这个算法对所有类型都可用然后再不同的情况下选最好的类型
      

  17.   

    generics还是很有用DI~~~~~~~~~
      

  18.   

    TO TIAOCI,我并不能确定不同的数据类型是否对算法的性能有影响,我只是想知道有没有影响。
    generics 好象只在 C# 2.0 中才能支持,目前我尚未使用该版本。
    另外,泛型的作用如果仅在编译时,应该没有性能上的副作用。如果泛型在运行时仍有影响的话,那么可能泛型也会被放弃的。
      

  19.   

    // 但在 32 位计算机上,byte 类型是否真能少占内存
    这个取决于CLR实现
    可以通过Marshal.SizeOf方法了解到,其内存占用确实是一个byte
    但是减少内存占用并不意味着就能提高性能,Windows的BOOL类型,实际上也是typedef int BOOL,理由是这样可以提高速度
    (CLR内的bool/Boolean类型也是,内存占用也是和一个int一样大,四个byte)关于decimal:
    decimal并不是primitive类型,CLR也不会直接对其处理(除了decimal以外的其它非primitive类型似乎只有string享有这种待遇)
    并且decimal类型具有最高的精度,内存占用比double还大一倍,应该是最慢的了