> Бенч неправильный для современных процов с их конвейерами. Одно сложение в цикле
> и сразу проверка на выход. Вообще-то так и задуманно (без конвееров и мельтдов^W спекулятивного выполнения конечно было бы медленнее) ;).
Тут упор не в числодробление, а в проверки "там и сям".
См. например соседнюю новость и дырку из-за signed размера для malloc
https://www.opennet.ru/opennews/art.shtml?num=53003
> Проблема вызвана некорректной обработкой отрицательных значений параметра, определяющего размер копируемой области, из-за использования ассемблерных оптимизаций,
там тоже народ так же аргументировал, что вставки-проверки размера будут сильно тормозить (хотя на фоне "жирного" вызова malloc, "экономия" на проверке параметра - по-любому смахивает на "экономию на спичах") ...
> Интереснее так:
> time ./a.out u 1 1 1 1 2147483647
> unchecked
> real 0m0,745s
>...
> time ./a.out c 1 1 1 1 2147483647
> checked
> real 0m1,326s
> Оно и неудивительно, ведь в непроверяемом варианте gcc нагенерил:
> d0: 01 da
% gcc -Wall -Wextra -Wpedantic -O2 addbench3.c
% for i in {1..20}; do time ./a.out c 1 1 1 1 2147483647 > /dev/null; done 2>&1 | awk '{sum+=$1}END{print "avg:" sum/NR}'|column
avg:4,63
% for i in {1..20}; do time ./a.out u 1 1 1 1 2147483647 > /dev/null; done 2>&1 | awk '{sum+=$1}END{print "avg:" sum/NR}'|column
avg:2,8205
Двойной if(of) - это моя промашка, остатки разных вариаций (проглядел и не удалил, благо убирается при оптимизации компилятором и на результат не влияет).
Ну и числодробилку без проверок можно сделать еще быстрее ;-)
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
typedef int v4si __attribute__ ((vector_size (16)));
int main(int argc, char **argv) {
v4si cnts = {0,0,0,0};
v4si add = {atoi(argv[2]), atoi(argv[3]),
atoi(argv[4]), atoi(argv[5]) };
int max = atoi(argv[6]);
printf("int max %d\n", INT_MAX);
puts("unchecked");
while (cnts[0] < max) {
cnts += add;
}
printf("i = %d\n", cnts[0]);
printf("j = %d\n", cnts[1]);
printf("k = %d\n", cnts[2]);
printf("l = %d\n", cnts[3]);
return 0;
}% gcc -Wall -Wextra -Wpedantic -O3 addbench3.c
% for i in {1..50}; do time ./a.out u 1 1 1 1 2147483647 > /dev/null; done 2>&1 | awk '{sum+=$1}END{print "avg:" sum/NR}'|column
avg: 1,8596