2014-02-10 3 views
0

Как изменить этот код, чтобы сделать последовательный программа для расчета времени настенных часов (time_t), необходимых для вычисления точечного продукта комплексных чисел.расчет настенных часов

#include "stdafx.h" 
#include <stdlib.h> 
#include<stdio.h> 

typedef struct complex{ 
double real; 
double img; 
}complex; 

complex add(complex a, complex b); 
complex multiply(complex *a, complex *b); 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
int choice, temp1, temp2; 
complex a, b, c; 

while (1) 
{ 
    printf("Press 1 to add two complex numbers.\n"); 
    printf("Press 2 to multiply two complex numbers.\n"); 
    printf("Press 3 to exit.\n"); 
    printf("Enter your choice\n"); 
    scanf_s("%d", &choice); 

    if (choice == 3) 
     exit(0); 

    if (choice >= 1 && choice <= 2) 
    { 
     printf("Enter a and b where a + ib is the first complex number."); 
     printf("\na = "); 
     scanf_s("%d", &a.real); 
     printf("b = "); 
     scanf_s("%d", &a.img); 
     printf("Enter c and d where c + id is the second complex number."); 
     printf("\nc = "); 
     scanf_s("%d", &b.real); 
     printf("d = "); 
     scanf_s("%d", &b.img); 
    } 
    if (choice == 1) 
    { 
     c.real = a.real + b.real; 
     c.img = a.img + b.img; 

     if (c.img >= 0) 
     printf("Sum of two complex numbers = %d + %di", c.real, c.img); 
     else 
     printf("Sum of two complex numbers = %d %di", c.real, c.img); 
    } 

    else if (choice == 2) 
    { 
     c.real = a.real*b.real - a.img*b.img; 
     c.img = a.img*b.real + a.real*b.img; 

    if (c.img >= 0) 
    printf("Multiplication of two complex numbers = %d + %di", c.real, c.img); 
     else 
    printf("Multiplication of two complex numbers = %d %di", c.real, c.img); 
    } 


    else 
    printf("Invalid choice."); 

    printf("\nPress any key to enter choice again...\n"); 
} 
    } 
+1

Бенчмаркинг сложный. Сложная арифметика не так сложна, что вы сможете измерить, сколько времени потребуется с помощью 'time_t', которая в большинстве систем имеет степень детализации в одну секунду. Вам придется повторить расчет несколько миллионов раз, чтобы заставить его заняться достаточно долго, чтобы быть измеримым, и вам, вероятно, придется использовать более эффективную меру, чем 'time()' и 'time_t'. Как минимум, используйте 'clock()'. Скорее используйте 'gettimeofday()', который сообщает на микросекундах, или 'clock_gettime()', который сообщает наносекундам. На какой платформе вы работаете? Ответ для Windows отличается. –

+1

Обратите внимание, что если оптимизатор видит, что вы не используете результаты расчета, он может оптимизировать вычисление вне кода, поэтому вы увидите, что все работает очень быстро. Преодоление оптимизатора без полного его блокирования - это одна из тех вещей, которые делают бенчмаркинг жестким. –

+0

@JonathanLeffler Вы не должны использовать 'gettimeofday' (http://blog.eitanadler.com/2012/11/dont-use-gettimeofday2-or-time3-for.html) либо (должна быть другая ссылка с более полезные альтернативы, но я не могу найти его прямо сейчас). – Kninnug

ответ

1

Типичный подход заключается в записи time() дважды и запустить код много раз, чтобы получить приближение 1-го порядка.

time_t t0,t1; 
time(&t0); 
int N = 1000000; 
for (int i=0; i< N; i++) { 
    DoCodeUnderTest(); 
    // c.real = a.real + b.real; 
    // c.img = a.img + b.img; 
} 
time(&t1); 
printf("Time %e\n", (double) (t1-t0)/N); 

Предлагаем использовать инструменты для профилирования для более точного ответа.


Леффлера @ Джонатан предложение использовать clock() также улучшение.

clock_t c1,c12; 
c1 = clock(); 
... // repeat runs of the code 
c2 = clock(); 
printf("Time %e\n", (double) (c1-c0)/CLOCKS_PER_SEC/N); 

Учитывая 1) Леффлер @ Джонатана второго предложение о законности повторения, так как компилятор может перехитрить код и 2) вопросы кэша намекает, что любые грубые методы силы, как предложенные здесь, в лучшем случае иллюстративные и не является окончательным времени.

Смежные вопросы