Сравнение производительности типов float, double и decimal в C#
Математический сопроцессор компьютера обычно дает лучшую производительность с определенным типом данных. Чтобы узнать, какая из них лучше всего работает в моей системе и узнать, насколько велика разница, я написал эту программу для сравнения производительности вычислений, которые используют float, double и decimal.
Введите несколько проб и нажмите кнопку «Перейти», чтобы выполнить следующий код.
// Сравнение характеристик. private void btnGo_Click(object sender, EventArgs e) { txtTimeFloat.Clear(); txtTimeDouble.Clear(); txtTimeDecimal.Clear(); Cursor = Cursors.WaitCursor; Refresh(); int num_trials = int.Parse(txtNumTrials.Text); Stopwatch watch = new Stopwatch(); float float1, float2, float3; double double1, double2, double3; decimal decimal1, decimal2, decimal3; watch.Start(); for (int i = 0; i < num_trials; i++) { float1 = 1.23f; float2 = 4.56f; float3 = float1 / float2; } watch.Stop(); txtTimeFloat.Text = watch.Elapsed.TotalSeconds.ToString() + " sec"; txtTimeFloat.Refresh(); watch.Reset(); watch.Start(); for (int i = 0; i < num_trials; i++) { double1 = 1.23d; double2 = 4.56d; double3 = double1 / double2; } watch.Stop(); txtTimeDouble.Text = watch.Elapsed.TotalSeconds.ToString() + " sec"; txtTimeDouble.Refresh(); // Масштабируем в 10 раз для десятичного. num_trials /= 10; watch.Reset(); watch.Start(); for (int i = 0; i < num_trials; i++) { decimal1 = 1.23m; decimal2 = 4.56m; decimal3 = decimal1 / decimal2; } watch.Stop(); txtTimeDecimal.Text = "~" + (watch.Elapsed.TotalSeconds * 10).ToString() + " sec"; Cursor = Cursors.Default; }
Код начинается с очистки текстовых полей результатов и получения количества желаемых результатов. Затем он запускает цикл, который выполняет простую математическую операцию в переменных float и отображает прошедшее время. Затем он повторяет эти шаги для типа данных double.
Далее код повторяет цикл для типа данных decimal. После запуска программы я обнаружил, что тип данных decimal был much медленнее, чем другие типы. Для запуска в течение разумного промежутка времени для десятичного типа данных программа делит количество испытаний на 10, а затем умножает прошедшее время на десять.
Если вы посмотрите внимательно на изображение, вы увидите, что для выполнения 100 миллионов вычислений программа использовала около 0,45 секунды для типа данных float, около 0.60 для double и, по оценкам, 22,04 секунды для типа данных decimal.
Мораль заключается в том, что если вы хотите производительность, используйте float. Если вам нужна большая точность, используйте double. Разница в производительности не такая уж большая.
Если вам нужна большая точность и вы готовы ждать намного дольше, используйте decimal. По крайней мере, на моем компьютере. Если вы запустите программу на своем компьютере и обнаружите, что двойной или десятичный результат дает более быстрый результат, чем float, отправьте комментарий ниже.