Сравнение скорости арифметических операций в 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 намного медленнее, чем остальные, что занимает почти в три раза больше. Другие операторы имеют сопоставимую производительность.