В C++ 11, какой из них быстрее: max(a-b, b-a)
или abs(a-b)
?Что быстрее в C++ 11: max (a-b, b-a) или abs (a-b)?
ответ
Вы можете использовать godbolt.org
, постоянную ссылку: https://goo.gl/QmxbDe
#include <algorithm>
#include <cstdlib>
int abs1(int a, int b) {
return abs(a-b);
}
int abs2(int a, int b) {
return std::max(a-b, b-a);
}
int abs3(int a, int b) {
return a > b ? a - b : b - a;
}
int abs4(int a, int b) {
return a == b ? a : (a > b ? a - b : b - a);
}
Результат для лязг-3,7 x86 с -O4
:
abs1(int, int): # @abs1(int, int)
subl %esi, %edi
movl %edi, %eax
negl %eax
cmovll %edi, %eax
retq
abs2(int, int): # @abs2(int, int)
movl %edi, %eax
subl %esi, %eax
subl %edi, %esi
cmpl %esi, %eax
cmovgel %eax, %esi
movl %esi, %eax
retq
abs3(int, int): # @abs3(int, int)
movl %esi, %eax
subl %edi, %eax
subl %esi, %edi
cmovlel %eax, %edi
movl %edi, %eax
retq
abs4(int, int): # @abs4(int, int)
movl %edi, %eax
subl %esi, %eax
jne .LBB3_2
movl %edi, %eax
retq
.LBB3_2:
jg .LBB3_4
subl %edi, %esi
movl %esi, %eax
.LBB3_4:
retq
Очевидно, что abs
от cstdlib
будет быстрее для случайных чисел.
код, созданный другими компиляторами, отличается и может привести к разным выводам. Только время, когда код, в фактическом объеме использования, даст реальный ответ. –
@dau_same Все компиляторы делают почти тот же код. Я провел бенчмаркинг (используя тест Google), все варианты взяты около 2-3 мс. – vladon
2-3 миллисекунды для нескольких инструкций, кажется, очень несовместимо. Кроме того, важно, как вы выполняете ваши тесты, вы вызываете одну и ту же функцию несколько раз? Вы называете abs2 сразу после abs1? Пропуски кэша потребуют больше времени в этом случае, чем время вычисления, которое у вас есть в любой из этих функций. –
Мое предположение:
макс:
2 substraction: a-b, b-a
1 comparation: a-b>b-a ? a-b : b-a
абс:
1 substraction: a-b
1 comparation a-b>0 ? a-b : -(a-b)
и сравните с 0 это проще, чем сравнивать два значения
Так что я бы сказал abs
быстрее до a,b
являются примитивными типами данных
Вещь, помеченная как «1 сравнение [sic]», скрывает больше операций, если вы не хотите, чтобы abs был примитивным (что является справедливым предположением * иногда *, но вы, похоже, не делаете этого) – harold
Хорошая заметка @harold – maskacovnik
Почему 'a> b? a - b: b - a'? Или даже 'a == b? a: (a> b? a - b: b - a) '. – vladon
Как и все вопросы, связанные с производительностью, есть только один реальный ответ. Вам нужно это время на вашей платформе, на вашем прецеденте. Различные реализации stl могут также реализовать эти функции по-разному, и ваша архитектура процессора в этом случае также играет большую роль.
Измерьте это и получите свои собственные выводы. Бьюсь об заклад, вы не заметите существенной разницы. Мне любопытно узнать о вашем случае использования, почему это так важно для вас?
Время, как метрика, действительно полезно только в контексте изменений. Здесь вы ищете изменения, которые происходят через вычисления за более короткий промежуток времени, но, возможно, в конечном счете наиболее существенный вид изменения состояния, который может произойти, находится внутри нас. Жизнь на самом деле просто переживает время (которое в конечном счете связано с переменами), и это часто короче, чем мы хотим. Мы можем испытывать столько изменений за конечное время, поскольку конечное время означает конечные изменения.
Поэтому я предлагаю, чтобы наиболее эффективным решением было использование профайлера и ретроспективный анализ после того, как вы написали код таким же простым способом, как вы можете это сделать (пока у вас не будет веской причины, а не к). Чтобы захватить профилировщик и привыкнуть к измерению, возможно, наиболее эффективное изменение состояния, которое может произойти в кратчайшие сроки для достижения более эффективного вычисления. Это было бы, безусловно, самым эффективным решением.
Вот картина Джессики Альбы для иллюстрации:
- 1. Javascript arrays ab = ba
- 2. python regex соответствие словам «ab» или «ba»
- 3. XPath: Как искать с AB - AB для AB? AB или AB? -AB
- 4. Почему «ab» .match (/ ab /) возвращает ["ab", "ab"]?
- 5. Выберите парное дублированные строки [AB & BA]
- 6. Почему re.findall ('(ab) +', 'abab') возвращает ['ab'] = в то время как re.findall ('(ab) +?', 'Abab') возвращает ['ab', 'ab' ]?
- 7. T-SQL: как бы вы отфильтровывали «ab, ab ab», но не «ab, ab»?
- 8. В чем смысл AB в AB | C в спецификации TypeScript?
- 9. Count пар AB и BA с третьим аргументом
- 10. Solr - Поиск «B» не возвращает «AB», «BA», «ABA»
- 11. C# - Есть ли способ сократить «if (ab == 1 || ab == 4 || ab == 6)«
- 12. NFA для регулярного выражения (ab) * (ba) * U aa *
- 13. В Ruby 1.9, если регулярное выражение/c? Ab/match «cab» или «ab» сначала?
- 14. AB Тестирование в Codeigniter
- 15. Ab-using languages
- 16. что-то вроде% ab% в NSArray
- 17. Что означает аргумент -ab в ffmpeg?
- 18. Булевский полнотекстовый поиск Исключить фразу AB-CD, например. - "AB-CD"?
- 19. Может ли структура, называемая «AB» содержать массив AB?
- 20. Всегда выключен бит AB
- 21. Ab initio rollback
- 22. Основные принципы ab метод
- 23. Булевая логика A'B + AB '
- 24. Как использовать программу AB
- 25. Расчет результатов теста AB
- 26. OpenBSD и AB?
- 27. Что получает правильные измерения, JMeter или Apache ab?
- 28. Что парадокс Симпсона подразумевает при тестировании AB?
- 29. SQL-запрос на AB -> C
- 30. Vim - ab для каждого языка
[Который быстрее?] (Http://ericlippert.com/2012/12/17/performance-rant/) – crashmstr
какой компилятор вы используете? – thumbmunkeys
Довольно бессмысленный вопрос. В зависимости от типов и компилятора и платформы есть много способов, которыми это может закончиться. – harold