У меня есть этот мир кода, и я хотел бы сделать его как можно быстрее.
Я не опытный разработчик C ++, поэтому я хотел бы знать, если вы, ребята, придумали действительно хорошую повторную реализацию этого алгоритма, так как я удалил все задания, думая, что это было бы хорошо …
И теперь я не знаю, было ли это лучше всего.
Итак, что быстрее?
for(register uint pPos = 0; pPos < size; pPos++) {
img->setPixel(pPos % dst_w, pPos / dst_w,
buffer32[
sf * (
(pPos / dst_w * src_w) +
(pPos % dst_w)
)
]);
}
или же
for(register uint pPos = 0, x = 0, y = 0; pPos < size; pPos++) {
x = pPos % dst_w;
y = pPos / dst_w;
img->setPixel(x, y,
buffer32[
sf * (
(y * src_w) + x
)
]);
}
ПримечаниеЯ действительно думал, что это хорошая вещь, чтобы спросить, я не понимаю поданных голосов.
Также всем спасибо за комментарии, многому научился.
Низкий уровень, простые назначения быстрее, чем умножения или сложения.
Некоторые процессоры имеют инструкции, которые могут выполнять умножение или сложение и присваивание в одной инструкции.
Отступить от уровня, назначений и арифметических операций между регистрами быстрее, чем выполнять операции с памятью. Доступ к кешу обычно быстрее, чем кэш-памяти. Чем дальше данные от ядра процессора, тем медленнее доступ. Доступ к памяти вне чипа будет медленнее, чем к памяти того же куска кремния, содержащего процессор.
Последствия быстрее
Итак, мы знаем, какие операции выполняются быстрее. Часто пропускаемые вопросы:
Давайте возьмем гипотетический процессор:
Таким образом, «экономия» между операцией сложения и назначением составляет 30 наносекунд. Экономия между операцией умножения и сложением составляет 50 наносекунд. Помните, что пользователи не могут различить что-либо меньше чем 1E-2 секунды. Итак, сколько итераций потребуется, чтобы заметить 50 наносекунд?
В современных процессорах необходимо выполнить множество итераций, чтобы получить значительное время от одного из этих изменений уровня команд. Таким образом, возврат инвестиций (время, которое требуется для оптимизации этих инструкций) не стоит. Окупаемость инвестиций высока только тогда, когда производительность программы влияет на продажи или требования (например, критические системы).
То, что быстрее, полностью зависит от компилятора, и на самом деле большинство оптимизирующих компиляторов по существу превратит вашу вторую версию в вашу первую во время компиляции. Даже если это не так, на современном компьютере операция деления займет всего несколько наносекунд, поэтому, если вы не выполняете эту операцию миллионы или миллиарды раз, это, вероятно, просто не имеет значения в вашем приложении.
Во всех подобных случаях ответ таков:
РЕДАКТИРОВАТЬ
Я только что попробовал сам с этим компилятором:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
С помощью этого компилятора ваш код компилируется в точно такой же вывод ASM с g++ -S -O1
, Таким образом, самая базовая оптимизация компилятора делает этот вопрос спорным. Если вы хотите сделать это как можно быстрее, используйте флаги оптимизации вашего компилятора и перестаньте беспокоиться о коде.
Первый медленнее, потому что вы делаете один и тот же расчет несколько раз. Хотя время, которое, вероятно, потребуется, ничтожно мало. Вы не заметите никаких улучшений, если ваш код не выполняет эти операции тысячи раз или фактически намного больше. Более того, ваш компилятор может оптимизировать код, чтобы сделать это в любом случае!
Используйте профилировщик, есть много бесплатных. Вы получите очень хорошее представление о времени, которое занимают операции / функции.
Проверь это Общие советы по улучшению производительности в C ++ и множество таких ссылок для стандартных практик, которые помогут вам улучшить ваши стандарты кодирования.