none
我来提出一个C#的性能问题,关于“小”类型的性能及内存分配。性能差异达到8倍 RRS feed

  • 常规讨论

  • 做坐标系转换的算法,定义了一个类:

        /// <summary>
        /// 空间中的点坐标
        /// </summary>
        public class TriDPoint
        {
            public double X
            {
                get;
                set;
            }
     
            public double Y
            {
                get;
                set;
            }
     
            public double Z
            {
                get;
                set;
            }
        }

    这是一个典型的类似struct的类型。

    在进行遥感影像坐标系计算时,会尝尝定义这样的类型

                //首先建立在扰动后的坐标系下的地面点位置
                TriDPoint[][] vibrationPixelCoordinate = new TriDPoint[sensorWidth][];
                TriDPoint[][] originPixelCoordinate = new TriDPoint[sensorWidth][];
     
                for (int i = 0; i < sensorWidth; i++)
                {
                    vibrationPixelCoordinate[i] = new TriDPoint[sensorHeight];
                    originPixelCoordinate[i] = new TriDPoint[sensorHeight];
                    for(int k = 0; k < sensorHeight; k++)
                    {
                        vibrationPixelCoordinate[i][k] = new TriPoint();
                        originPixelCoordinate[i][k] = new TriPoint();
                    }
                }

    这里sensorWidth 和sensorHeight都是 10^5 数量级的。

    在后面的算法测试中,发现矩阵计算过程并不是代码热点,热点是 

    TriDPoint resPoint = new TriDPoint();

    占用了大概40%的CPU样本。

    仔细想了想,这么小的对象,一个一个在堆上分配,是不是这样造成的性能下降呢?

    于是将数据修改为

                double[][] originPixelCoordinateX = new double[sensorWidth][];
                double[][] originPixelCoordinateY = new double[sensorWidth][];
                //for (int i = 0; i < sensorWidth; i++)
                Parallel.For(0, sensorWidth, (int i) =>
                {
                    //vibrationPixelCoordinate[i] = new TriDPoint[sensorHeight];
                    originPixelCoordinateX[i] = new double[sensorHeight];
                    originPixelCoordinateY[i] = new double[sensorHeight];
                });

    整体算法性能瞬间提高了约8倍。。。。

    唔。。。性能工具很有用,第二,建立class的话,貌似粒度不要太小。



    • 已编辑 mibxue 2013年4月14日 4:50 修改错别字
    2013年4月13日 17:15

全部回复