Я пытаюсь получить достойную производительность от MSVC для этого кода.Мой наивный тест показывает, что время выполнения исполняемого файла clang составляет около 10% времени выполнения MSVC.GCC находится между двумя и обычно составляет около 25% MSVC.Можно ли обмануть MSVC для создания лучшей сборки?Я посмотрел на Compiler Explorer , но мои эксперименты не имели большого значения.Для фона это основной блок генератора случайных чисел Philox4x32.
#include <inttypes.h>
#include <time.h>
#include <stdio.h>
struct array2x32 {
uint32_t v[2];
};
struct array4x32 {
uint32_t v[4];
};
struct array4x32 round4x32(struct array4x32 ctr, struct array2x32 key) {
uint32_t hi0, hi1, lo0, lo1;
uint64_t product;
product = 0x00000000D2511F53ULL * (uint64_t)ctr.v[0];
lo0 = (uint32_t)product;
hi0 = ((uint32_t)(product>>32)) ^ ctr.v[3] ^ key.v[1];
product = 0x00000000CD9E8D57ULL * (uint64_t)ctr.v[2];
lo1 = (uint32_t)product;
hi1 = ((uint32_t)(product>>32)) ^ ctr.v[1] ^ key.v[0];
struct array4x32 out = {{hi1, lo1, hi0, lo0}};
return out;
}
#define N 1000000000
int main(){
struct array4x32 ctr = {{0, 0, 0, 0}};
struct array2x32 key = {{0, 0xDEADBEAF}};
struct array4x32 out;
uint64_t count = 0, sum = 0;
int i, j;
clock_t begin = clock();
for (i = 0; i < N / 4UL; i++) {
ctr.v[0]++;
out = round4x32(ctr, key);
for (j = 0; j < 4; j++) {
sum += out.v[j];
count++;
}
}
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("%0.10f", time_spent);
printf("0x%" PRIx64 "\ncount: %" PRIu64 "\n", sum, count);
printf("%" PRIu64 " randoms per second\n",
(uint64_t)((N / time_spent) / 1000000 * 1000000));
}