我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++代码的包装器,最终使用字节数组.我也正在编译"不安全"的编译器标志.不确定这是否会产生任何影响.所有代码都在发布模式下编译.
我已经发现了这个的原因。发生这种情况是因为在第一种情况下,我的计算器对象的创建包含在计时结果中,而在第三种情况下则没有。
如果我理解正确的话,堆栈变量实际上并不是在您键入“new()”的行上创建的,编译器将内存分配移动到方法“prolog”。
请参阅此页面:https://msdn.microsoft.com/en-us/library/tawsa7cb.aspx
“如果需要,序言将参数寄存器保存在其主地址中,将非易失性寄存器压入堆栈,为本地变量和临时变量分配堆栈的固定部分,并可选择建立帧指针。”
所以我的“情况1”包括“新”(因为它发生在TestFunction的序言中),“情况3”排除它,因为“新”已经发生了。
归档时间: |
|
查看次数: |
138 次 |
最近记录: |