Лучший примитивный тип для быстрого сравнения чисел? - PullRequest
0 голосов
/ 30 июня 2018

У меня есть функция, которая выполняет несколько сотен миллионов итераций, пытаясь найти оптимальную комбинацию заданного набора возможностей. Все мои данные предварительно рассчитаны и почти вся арифметика проста >= или <= сравнение этих предварительно рассчитанных значений.

Мне интересно, есть ли преимущество при использовании некоторых простых типов (int, long, double) при этом простом сравнении.

Я знаю, что мог бы пойти и запустить тест, чтобы увидеть, какой из них "лучший", но также важно понять основную причину. Например, возможно int легче всего сопоставить, потому что он занимает меньше памяти, или, возможно, с плавающей точкой double легче определить, какое значение 10 является значением, которое ускоряет сравнение в некоторых случаях. Мне интересно знать эти основы, и простой тест не скажет мне этого.

1 Ответ

0 голосов
/ 30 июня 2018

Это преждевременная оптимизация. Вы должны выбрать один тип данных, создать на его основе реализацию и запустить тест производительности с использованием фактической реализации, а не какого-то готового теста, который сравнивает десятки тысяч случайных значений определенного типа.

Причина тестирования с использованием вашей конкретной реализации заключается в том, что существует ряд факторов, которые оказывают гораздо большее влияние на скорость, чем время необработанных сравнений:

  • Коэффициент попадания в кэш - доступ к памяти в несколько раз медленнее, чем доступ к кэшированному значению. Реструктуризация ваших циклов при доступе к большим массивам данных может значительно ускорить вашу программу без изменения количества необработанных сравнений, которые ваша программа выполняет
  • Прогнозы ветвления - поддержание работы конвейера ЦП очень важно. Если ваши циклы и ваши данные структурированы таким образом, чтобы оптимизировать количество правильных предсказаний ветвлений, ваш код выполняется намного быстрее, чем код с большим количеством неверных предсказаний ветвлений

Невозможно измерить любую из этих метрик, пока не будет реализован ваш фактический алгоритм. После оптимизации фактической реализации для кэширования и ветвления переключение базового типа данных становится относительно простой задачей.

...