秒表根据代码所在的位置给出不同的结果

Jap*_*s55 6 c# c++ c#-4.0

Stopwatch在C#项目中得到了一些令人困惑的结果.请考虑以下代码:

static void Main(string[] args)
{
    byte[] myEventArray = GetEventByteArrayFromDatabase();
    byte[] myEventItemsArray = GetEventItemByteArrayFromDatabase();
    uint numEvents = 1000;
    uint numEventItems = 1000;

    Stopwatch sw1 = Stopwatch.StartNew();
    TestFunction(ref myEventArray, numEvents, ref myEventItemsArray, numEventItems);
    sw1.Stop();

    float timeTakenInSeconds = (float)sw2.ElapsedTicks / Stopwatch.Frequency;
    Console.WriteLine("Total time: " + timeTakenInSeconds + " seconds. ");
}

static void TestFunction(ref byte[] EventArray, uint numEvents, ref byte[] EventItemArray, uint numEventItems)
{
        Calculator calc = new Calculator();
        calc.Test(EventArray, numEvents, EventItemArray, numEventItems);
}
Run Code Online (Sandbox Code Playgroud)

我跑了这个,得到大约0.2秒的时间.现在考虑一下:

static void Main(string[] args)
{
    byte[] myEventArray = GetEventByteArrayFromDatabase();
    byte[] myEventItemsArray = GetEventItemByteArrayFromDatabase();
    uint numEvents = 1000;
    uint numEventItems = 1000;

    Stopwatch sw1 = Stopwatch.StartNew();
    Calculator calc = new Calculator();
    calc.Test(myEventArray , numEvents, myEventItemsArray , numEventItems);
    sw1.Stop();

    float timeTakenInSeconds = (float)sw1.ElapsedTicks / Stopwatch.Frequency;
    Console.WriteLine("Total time: " + timeTakenInSeconds + " seconds. ");
}
Run Code Online (Sandbox Code Playgroud)

我运行它,并获得类似的结果,正如人们所期望的那样.最后,看看这个:

static void Main(string[] args)
{
    byte[] myEventArray = GetEventByteArrayFromDatabase();
    byte[] myEventItemsArray = GetEventItemByteArrayFromDatabase();
    uint numEvents = 1000;
    uint numEventItems = 1000;

    TestFunction(ref myEventArray, numEvents, ref myEventItemsArray, numEventItems);
}

static void TestFunction(ref byte[] EventArray, uint numEvents, ref byte[] EventItemArray, uint numEventItems)
{
    Stopwatch sw1 = Stopwatch.StartNew();
    Calculator calc = new Calculator();
    calc.Test(EventArray, numEvents, EventItemArray, numEventItems);
    sw1.Stop();

    float timeTakenInSeconds = (float)sw1.ElapsedTicks / Stopwatch.Frequency;
    Console.WriteLine("Total time: " + timeTakenInSeconds + " seconds. ");
}
Run Code Online (Sandbox Code Playgroud)

当我运行时,由于某种原因,时间结果总是快十倍.任何想法为什么会这样?

更多信息: Calculator类在C++/CLI中定义.我正在使用它作为本机C++代码的包装器,最终使用字节数组.我也正在编译"不安全"的编译器标志.不确定这是否会产生任何影响.所有代码都在发布模式下编译.

Jap*_*s55 2

我已经发现了这个的原因。发生这种情况是因为在第一种情况下,我的计算器对象的创建包含在计时结果中,而在第三种情况下则没有。

如果我理解正确的话,堆栈变量实际上并不是在您键入“new()”的行上创建的,编译器将内存分配移动到方法“prolog”。

请参阅此页面:https://msdn.microsoft.com/en-us/library/tawsa7cb.aspx

“如果需要,序言将参数寄存器保存在其主地址中,将非易失性寄存器压入堆栈,为本地变量和临时变量分配堆栈的固定部分,并可选择建立帧指针。”

所以我的“情况1”包括“新”(因为它发生在TestFunction的序言中),“情况3”排除它,因为“新”已经发生了。