Linux i386
> gcc -O3 -march=native  3.c -o 3.out && ./3.out
Time:(0.00000000)ms . Sum: 49999995000000

иногда но редко получается
> gcc -O3 -march=native  3.c -o 3.out && ./3.out
Time:(10.00000000)ms . Sum: 49999985000000

Кстати лучше считать с нуля тогда процесор может использовать prefetch

10.02.2015 9:28, Михаил Монашёв пишет:
Здравствуйте, Mons.

Вот код, который соответствует исходной задаче.

#include <stdio.h>
#include <time.h>

int main()
{
         unsigned __int32 *arr;

         arr  = (unsigned __int32 *) malloc(10000000 * sizeof(unsigned 
__int32));

         int i;
         for( i=10000000-1; i>=0; i--) {
                         arr[i] = i;
         }

         clock_t start = clock();

         unsigned __int64 sum;
         sum = 0;
         for( i=10000000-1; i>=0; i--) {
                         sum+=arr[i];
         }

         clock_t end = clock();

         printf("Time:(%0.8f)ms . Sum: %llu", 
((double)end-start)/CLOCKS_PER_SEC*1000, sum);
         return 0;
}

C:\Temp>gcc -O3 -march=native  3.c -o 3.exe
3.c: In function 'main':
3.c:8:30: warning: incompatible implicit declaration of built-in function 
'malloc' [enabled by default]
   arr  = (unsigned __int32 *) malloc(10000000 * sizeof(unsigned __int32));
                               ^

C:\Temp>3.exe
Time:(11.00000000)ms . Sum: 49999995000000

Это время в 32-битной венде.

Как победить этот варнинг при компиляции я не разбирался пока.


int main (int argc,char **argv) {
═ ═ ═ ═ longint S = atoi(argv[1]);
═ ═ ═ ═ longint i,z;
═ ═ ═ ═ clock_t start = clock();
═ ═ ═ ═ longint sum = 0;
═ ═ ═ ═ for(z = 0; z < 1000; z++ ){
═ ═ ═ ═ ═ ═ ═ ═ sum = 0;
═ ═ ═ ═ ═ ═ ═ ═ for (i=0;i < S - S % 16; i+=16) {
═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ sum += i ═ + i+1 + i+2═ + i+3═ + i+4═ + i+5═ + i+6═ + 
i+7
═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ══+═ i+8 + i+9 + i+10 + i+11 + i+12 + i+13 + i+14 + 
i+15
═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ;
═ ═ ═ ═ ═ ═ ═ ═ }
═ ═ ═ ═ ═ ═ ═ ═ for (i; i < S; i++ ) {
═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ sum += i;
═ ═ ═ ═ ═ ═ ═ ═ }
═ ═ ═ ═ }
═ ═ ═ ═ clock_t end = clock();
═ ═ ═ ═ printf("%lu (%0.8f)\n",sum,((double)end-start)/1e6/z);
}




1.5 ms

gcc --std=c99 -O3 -march=native



--═
Mons Anderson
<[email protected]>




On 9 февр. 2015 г., at 16:11, Михаил Монашёв
<[email protected]> wrote:
Здравствуйте, Mons.
Народ, я не осилил дочитать это всё до конца.
А давайте-ка соберёмся и померяемся.
Не в плане теории, а в плане конкретных чисел
сравним разные языки, подходы и т.п.


А ═собираться ═обязательно? ═Можно ведь и удалённо. Я на Go пишу всего
месяц ═и ═мне было бы сложно придти и что-то нормально на нём написать
за малое время. Но сравнить языки было бы интересно.
Предложу ═простую ═задачку, ═которая ═покажет, ═насколько ═хорошо язык
работает ═с ═памятью: ═сложить ═все ═значения ═массива, ═состоящего из
10000000 ═целых чисел. Код там простой: создаём массив, заполняем его,
замеряем ═время, ═потом ═в ═цикле ═складываем ═элементы массива, снова
замеряем время и выдаём результат. Вот мой вариант на Go:
https://play.golang.org/p/iHGG3nV10L
Тонкости: ═в песочнице код съедает много процессора и время там всегда
одно ═и ═то ═же, поэтому его надо сохранить в файл, например main.go и
потом запустить вот так: go run main.go
Скомпилировать ═в исполняемый файл можно вот так: go build main.go
А вот так выйдет более быстрая версия: go build -gcflags="-B" main.go
Скачать Go можно вот тут: http://golang.org/
--
С уважением,
  Михаил ═════════════════════════mailto:[email protected]




--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить