gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:14 26 4
gpt4 key购买 nike

我的 C# 项目中出现了一些令人困惑的 Stopwatch 结果。考虑以下代码:

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);
}

我运行它,得到大约 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. ");
}

我运行它,得到了与人们预期的相似的结果。最后,检查一下:

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. ");
}

当我运行那个时,出于某种原因,计时结果总是快十倍。知道为什么会这样吗?

更多信息:计算器类在 C++/CLI 中定义。我将它用作最终与字节数组一起使用的 native C++ 代码的包装器。我也在使用“不安全”编译器标志进行编译。不确定这是否会产生任何影响。所有代码都在 Release模式下编译。

最佳答案

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

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

查看此页面:https://msdn.microsoft.com/en-us/library/tawsa7cb.aspx

“如果需要,prolog 将参数寄存器保存在它们的起始地址中,将非 volatile 寄存器压入堆栈,为局部变量和临时变量分配堆栈的固定部分,并可选择地建立一个帧指针。”

所以我的“案例 1”包含了"new"(因为它发生在 TestFunction 的序言中)而“案例 3”排除了它,因为"new"已经发生了。

关于c# - 秒表根据代码所在的位置给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com