я измерил время выполнения двух способов расчета мощности 2:C#: Почему вызов функции быстрее, чем ручной встраивание?
1) инлайн
result = b * b;
2) С помощью простого вызова функции
result = Power(b);
При работе в режиме отладки все выглядит так, как ожидалось: вызов функции значительно дороже, чем вычисление в строке (385 мс в строке против вызова функции 570 мс).
В режиме освобождения я ожидаю, что компилятор значительно ускорит время выполнения вызова функции, потому что компилятор встроил в себя очень маленькую функцию Power()
. Но я не ожидал, что вызов функции будет более быстрым, чем ручной расчет.
Самое удивительное в этом случае: в сборке релизов первый запуск требует 109 мс, а второй запуск с вызовом Power()
- всего 62 мс.
Как вызов функции быстрее, чем ручной встраивание?
Вот программа для воспроизведения:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Test");
// 1. Calculating inline without function call
Stopwatch sw = Stopwatch.StartNew();
for (double d = 0; d < 100000000; d++)
{
double res = d * d;
}
sw.Stop();
Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);
// 2. Calulating power with function call
Stopwatch sw2 = Stopwatch.StartNew();
for (int d = 0; d < 100000000; d++)
{
double res = Power(d);
}
sw2.Stop();
Console.WriteLine("Function: " + sw2.ElapsedMilliseconds);
Console.ReadKey();
}
static double Power(double d)
{
return d * d;
}
}
Вы начали программу под отладчиком (F5)? В этом случае оптимизация была подавлена. – usr
Вы запускали сгенерированный файл .exe или внутри VS в режиме выпуска? Кроме того, вы пробовали называть их в разных заказах? Я нашел, что это делает тонкую разницу. – DGibbs
Ну, почему использование int ** как двойного ** быстрее, чем просто использование двойника? – Vercas