Сравнение скорости арифметических операций в C#
В этом примере сравниваются скорости арифметических операций с разными типами данных. Существует большая разница между скоростями операций с использованием типа данных decimal и других типов, поэтому выполнение цикла требует определенного количества времени. Если цикл принимает разумное количество времени для int, то для decimal это занимает слишком много времени. И наоборот, если цикл принимает разумное количество времени для decimal, то слишком быстро получить большую часть измерений для других типов данных.
В этом примере используется другой подход, поэтому разумные измерения требуют разумного промежутка времени. Он позволяет ввести время, а затем проверяет операции на этот промежуток времени для каждого из типов данных.
Следующий код показывает, как программа проверяет тип данных decimal.
double sec_per_test = double.Parse(txtSecPerTest.Text);
DateTime start_time, stop_time, time_now;
TimeSpan elapsed;
double trials_per_sec, ns_per_trial;
...
// Десятичная дробь.
start_time = DateTime.Now;
stop_time = start_time.AddSeconds(sec_per_test);
for (int trial = 0; ; trial++)
{
decimal i = 12345m * 54231m / 13m;
decimal j = i * 267m;
i = j / 287m;
time_now = DateTime.Now;
if (time_now > stop_time)
{
elapsed = time_now - start_time;
trials_per_sec = trial / elapsed.TotalSeconds;
txtDecimal.Text = trials_per_sec.ToString("N");
txtDecimal.Refresh();
ns_per_trial = 1.0 / trials_per_sec * 1000000000;
txtDecimalSecs.Text = ns_per_trial.ToString("0.00000000");
txtDecimalSecs.Refresh();
break;
}
}
Перед началом тестов программа считывает количество введенных секунд. Чтобы проверить тип данных decimal, он получает текущее время и добавляет желаемую длину теста к этому, чтобы получить требуемое время остановки.
Затем код вводится в цикл, который выполняется до вычисленного времени остановки. Внутри цикла код выполняет некоторые арифметические операции. Затем, если текущее время после желаемого времени остановки, программа отображает количество испытаний, выполняемых в секунду, и количество наносекунд, используемых каждой из арифметических операций.
Код для других типов данных аналогичен.
Если вы посмотрите на результаты, вы увидите, что decimal намного медленнее, чем остальные, что занимает почти в три раза больше. Другие операторы имеют сопоставимую производительность.
