Anonymous
Вот это вариант, кстати
Anonymous
Но я подозреваю, что оптимизация просто по-разному работает
Anonymous
если на -g одинаково
Eugene
Проверил. Вот этот код через GCC работает быстрее, чем через G++ (64 бита):
#include <stdio.h>
#include <time.h>
#include <stdint.h>
int inner_loop(uint64_t *n, uint64_t i)
{
int count = 0;
while (*n % i == 0) {
++count;
*n /= i;
}
return count;
}
int prime_count(uint64_t n)
{
int count = 0;
for (uint64_t i = 2; i*i <= n; ++i) {
count += inner_loop(&n, i);
}
if (n > 1) { ++count; }
return count;
}
int main()
{
volatile int x = 5;
double elapsed = clock();
int n = prime_count(1000000000000000003);
elapsed = (clock()-elapsed) / CLOCKS_PER_SEC;
printf("Elapsed time: %.3f sec (result = %d)\n", elapsed, n);
return 0;
}
Eugene
Сейчас сделаю -g
Eugene
Eugene
Eugene
🤣
Eugene
На виртуалке запускайте, если боитесь :)
Eugene
Anonymous
Ну, сишная прога не линкует всякое с++ рантаймовое гуано
Anonymous
например
Eugene
Там между 2-мя вызовами clock'ов код одинаковый
Eugene
В цикле, по крайней мере, точно
Anonymous
Ха!
Anonymous
В случае с сишной программой два типа используется
Eugene
В смысле?
Anonymous
https://clip2net.com/s/3XRGSaO
Anonymous
целый и флоат
Anonymous
с цпп только флоат
Anonymous
Вощем, сишная работает на SSE2
Eugene
Откуда там вообще флоат? Разве что в elapsed.
Anonymous
плюсовая SSE
Eugene
Я не понимаю. 99.999% кода выполняется в цикле. Там никаких флоатов нет и ссе нет. И код одинаковый. Там инструкций штук 15.
Eugene
Anonymous
Да
Anonymous
Все так
Anonymous
Просто прикольно
Anonymous
интересно, что будет, если собрать интеловским компилятором
Eugene
Если плюс на нижнем inner_loop открыть, что покажет?
Eugene
И почему он не видит int64 ?
Anonymous
ничего
Anonymous
а вот так
Anonymous
нету его
Eugene
Как так?
Anonymous
могу дизасм кинуть
Anonymous
кстати
Eugene
Киньте
Anonymous
Address Line Assembly Total Time % Self Time % Traits
0 0x402d30 Block 1: 999999999
0 0x402d30 19 add r8, 0x1 0.387s 1.15% 0.387s 3.46%
0 0x402d34 20 add ebx, r9d 0.382s 1.14% 0.382s 3.41%
0 0x402d37 19 mov rax, r8
0 0x402d3a 19 imul rax, r8
0 0x402d3e 19 cmp rax, rcx 0.279s 0.83% 0.279s 2.50%
0 0x402d41 19 jnbe 0x402d70
0 0x402d43 Block 2: 999999998
0 0x402d43 20 xor edx, edx
0 0x402d45 20 mov rax, rcx
0 0x402d48 20 xor r9d, r9d
0 0x402d4b 20 div r8 0.280s 0.83% 0.280s 2.50%
0 0x402d4e 20 test rdx, rdx 9.861s 29.38% 9.861s 88.13%
0 0x402d51 20 jnz 0x402d30 <Block 1>
0 0x402d53 Block 3:
0 0x402d53 20 mov rax, rcx
0 0x402d56 20 xor edx, edx
0 0x402d58 20 add r9d, 0x1
0 0x402d5c 20 div r8
0 0x402d5f 20 xor edx, edx
0 0x402d61 20 mov rcx, rax
0 0x402d64 20 div r8
0 0x402d67 20 test rdx, rdx
0 0x402d6a 20 jz 0x402d53 <Block 3>
0 0x402d6c Block 4:
0 0x402d6c 20 jmp 0x402d30 <Block 1>
Anonymous
Плюсовый
Anonymous
Address Line Assembly Total Time % Self Time % Traits
0 0x402cf0 Block 1: 999999999
0 0x402cf0 18 add r9, 0x1 0.311s 0.92% 0.311s 2.76%
0 0x402cf4 19 add ebx, r10d 0.281s 0.83% 0.281s 2.50%
0 0x402cf7 18 mov rax, r9
0 0x402cfa 18 imul rax, r9
0 0x402cfe 18 cmp rax, rcx 0.274s 0.81% 0.274s 2.44%
0 0x402d01 18 jnbe 0x402d30
0 0x402d03 Block 2: 999999998
0 0x402d03 19 xor edx, edx
0 0x402d05 19 mov rax, rcx
0 0x402d08 19 xor r10d, r10d
0 0x402d0b 19 div r9 0.220s 0.65% 0.220s 1.96%
0 0x402d0e 19 test rdx, rdx 10.159s 30.11% 10.159s 90.34%
0 0x402d11 19 jnz 0x402cf0 <Block 1> 0.000s 0.00% 0.000s 0.00%
0 0x402d13 Block 3:
0 0x402d13 19 mov rax, rcx
0 0x402d16 19 xor edx, edx
0 0x402d18 19 add r10d, 0x1
0 0x402d1c 19 div r9
0 0x402d1f 19 xor edx, edx
0 0x402d21 19 mov rcx, rax
0 0x402d24 19 div r9
0 0x402d27 19 test rdx, rdx
0 0x402d2a 19 jz 0x402d13 <Block 3>
0 0x402d2c Block 4:
0 0x402d2c 19 jmp 0x402cf0 <Block 1>
Anonymous
сишный
Eugene
А imul, jnbe и пр почему без времени?
Anonymous
ой
Anonymous
сорян
Anonymous
второе не то
Anonymous
вот теперь то
Anonymous
слишком быстро проскочило
Eugene
И test rdx,rdx... Ну это бред какой-то!
Anonymous
семплирование реже
Eugene
Ну вот. Найдите отличия в этих картинках :)
Anonymous
хммм
Eugene
Ну я не верю, что 99% или сколько там, приходится на test rdx,rdx
Eugene
Учитывая, что Advisor этот не показывает тип данных int64, он мне уже не очень нравится :)
Anonymous
https://pastebin.com/3GVr5Wbd
Anonymous
https://pastebin.com/BJjYU2uZ
Eugene
Да я это у себя видел :)
Anonymous
Anonymous
не очень дружит
Anonymous
Если интельным бахнуть, то будет по-другому
Anonymous
Кстати!
Anonymous
Можешь попробовать заюзать флаг конопляции -march
Eugene
А с чем сравнивать там?
Anonymous
или какой там форсит заюзать ISA на машине
Anonymous
Eugene
Короче, надо Агнеру написать на его форум. Спросить :)
Anonymous
main дизасм просто
Anonymous
второе С
Anonymous
набор инструкций разный в листинге
Anonymous
То есть если собирать -O2 -g то скорости сравниваются?
Anonymous
если без -g Тогда разные?
Anonymous
Надо качать мингву короч :)
Anonymous
GNU C11 7.3.0 -mtune=core2 -march=nocona -g -O2
Anonymous
GNU C++14 7.3.0 -mtune=core2 -march=nocona -g -O2
Eugene
Eugene
Смотрите. Если добавить к этому коду volatile int x = 5; (в начале main'а), то разницы в скорости почти не будет. Почему? А потому что код сдвигается. Там какой-то прикол с выравниванием. Понимаете? В этом и суть. Это я и хочу разгадать.
Eugene
Потому что 15% прироста скорости из-за выравнивания – это очень круто.