/ / Как да се намали режийният коефициент при измерване на производителността? - c ++, представяне, профилиране

Как да намалите режийните разходи при измерване на производителността? - c ++, представяне, профилиране

Когато се опитам да измерим ефективността на парче код, го сложих в цикъл и итерах за един милион пъти.

for i: 1 -> 1000000
{
"test code"
}

Но с помощта на инструменти за профилиране, открих, чегорната част на цикъла е толкова голяма, че значително въздейства върху резултата, особено когато част от кода е малка, да речем 1,5 s от изминатото време с 0,5 s от върха на веригата.

Така че бих искал да знам дали има по-добър начинда тествате ефективността? Или трябва да се придържам към този метод, но да правя няколко парчета от един и същи код под една и съща верига, за да увелича теглото си в изпълнението?

for i: 1 -> 1000000
{
"test code copy 1"
"test code copy 2"
"test code copy 3"
"test code copy 4"
}

Или е добре да извадите режима на отклонение от общото време? Благодаря много!

Отговори:

1 за отговор № 1

Ще трябва да разгледате регистрационния списък, генериран от компилатора. Изчислете броя на инструкциите в режийните разходи.

Обикновено, за увеличаващ се цикъл, режийният състав се състои от:

  1. Увеличаващ се брояч.
  2. Отклоняване на върха на цикъла.
  3. Сравнение на брояча с лимита.

На много процесори това са един процесорвсяка инструкция или близка до нея. Затова разберете средното време за инструкция за излизане, умножете се по броя на инструкциите в режийните разходи и това става времето за генериране на време за една итерация.

Например, на процесор, който осреднява 100nsза всяка инструкция и 3 инструкции за режийни, всяка итерация използва 3 * (100ns) или 300ns за всяка итерация. При 1.0E6 повторения, 3.0E08 наносекунди ще се дължи на режийни разходи. Извадете това количество от измерванията си за по-точно измерване на съдържанието на цикъла.