c#以不同方式分配性能

时间:2011-02-24 03:05:05

标签: c# performance

大家,最近我正在调试一个提高性能的程序。我注意到关于赋值性能的兴趣。下面的代码是我的测试代码。

代码A

public class Word{....}

public class Chunk
{
    private Word[] _items;
    private int _size;
    public Chunk()
    {
        _items = new Word[3];
    }

    public void Add(Word word)
    {
        _items[_size++] = word;
    }
}

        Chunk chunk = new Chunk();

        for (int i = 0; i < 3; i++)
        {
            chunk.Add(new Word() { });//
        }

代码B

public class Chunk
{
    private Word[] _items;
    private int _size;
    public Chunk()
    {
        _items = new Word[3];
    }

    public Word[] Words
    {
        get
        {
            return _items;
        }
    }

    public int Size
    {
        get{return _size;}
        set{_size=value;}
    }
}

        Chunk chunk = new Chunk();
        for (int i = 0; i < 3; i++)
        {
            chunk.Words[i] = new Word() { };
            chunk.Size + = 1;
        }

在我的测试中使用visual studio'profiling工具,调用主方法32000次,该性能显示CODE B比CODE更快。为什么CODE B比CODE A更快?谁可以给我一个建议? 感谢

更新:对不起,我忘了增加代码B中的_size代码,我更新了我的代码B

更新:@Shiv Kuma是的,在30000个通话时间的情况下,代码A与代码B类似。我测试了700K文件,代码可以调用29000次左右。 同时,代码B比代码A快100毫秒,实际上代码B在实际段中要好得多。 还有一件事我想知道为什么Code B比Code A更快,即使是同一个任务? 无论如何,谢谢你的回复。

2 个答案:

答案 0 :(得分:1)

在CODE A中,你递增两次。进入你的for循环:

for (int i = 0; i < 3; i++)

一旦进入你的方法:

_items[_size++] = word;

在CODE B中,你只在for循环中递增一次。

它并不多,但肯定会导致性能差异。

是的,方法调用也会增加少量开销。

答案 1 :(得分:1)

我能想到的三个原因。

  1. Chunk.Add()是一个方法调用,与内联运行的相同代码相比,方法调用总是很昂贵。
  2. 第一个代码示例中有两个增量网(_size ++和i ++)
  3. chunk.Words数组可能在本地缓存(第2个例子),因此每次调用Add时都不需要评估chunk.items(第1个例子)。