QueryPerformanceCounter的怪异行为,用于测量微秒

时间:2018-10-18 09:52:17

标签: c++ winapi

我需要衡量我书面职能的表现。由于我无法使用C ++ 11并且需要微秒,因此我使用了来自windows.h的QueryPerformanceCounter。

int nextSymbol = i + 1;
char typeOfQuotes = line[i];    

private static void ParseComplexField(string line, StringBuilder tokenBuilder, ref int i, char typeOfQuotes)
        {
            int slashCount = 0;
            for (; i < line.Length; i++)
            {
                if (line[i] == '\\')
                {
                    slashCount++;
                    if (line[i - 1] == '\\' && slashCount % 2 == 0)
                    {
                        tokenBuilder.Append("\\");
                        slashCount = 0;
                    }
                }
                else if (line[i] == typeOfQuotes)
                {
                    if (line[i - 1] == '\\' && slashCount % 2 == 1)
                    {
                        tokenBuilder.Append(typeOfQuotes);
                        slashCount = 0;
                    }
                    else break;
                }
                else
                {
                    tokenBuilder.Append(line[i]);
                    slashCount = 0;
                }
            }
        }

如果我不调用appendToCsvFile(),则timeElapsed的结果通常在2到10微秒之间。

调用函数appendToCsvFile()只会将结果写入文件,而这只会影响测量结果(结果介于20到60微秒之间)。

该功能在测量后称为“功能”,但有一定作用。有什么理由可以做到这一点?是否有适用于Visual C ++ 2010的适合微秒测量的库?

1 个答案:

答案 0 :(得分:2)

在微秒范围内测量某物时,您需要预期会发生奇怪的事情。

有许多可能的原因,包括:

  1. appendToCsvFile正在清除CPU缓存,而没有进行此调用,myFunctionToTest一遍又一遍地使用相同的内存,这将导致良好的热缓存和更好的性能。
  2. 编写文件时,您会触发一系列操作,最终导致数据最终存储在存储介质上。当控制权返回到您的程序时,并不是所有这些操作都会完成,从而导致额外的后台CPU使用率降低myFunctionToTest