home *** CD-ROM | disk | FTP | other *** search
- /*
- * A benchmark for transcendental operations: sin, asin, cos, acos, tan, atan, log, log10.
- * Uses ANSI C features including macro parameter token-pasting.
- * James Day, 100276.3552@compuserve.com 5 Feb 1995
- */
-
- #define DEFAULTLOOPS 100000L
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <math.h>
-
- #define MATHLOOP(Op) \
- { \
- Total = 0.0; \
- StartClock = clock(); \
- for (Loop = Loops; Loop > 0; Loop--) \
- { \
- Total += ##Op(Angle) \
- + ##Op(Angle+Step1) \
- + ##Op(Angle+Step2) \
- + ##Op(Angle+Step3) \
- + ##Op(Angle+Step4) \
- + ##Op(Angle+Step5) \
- + ##Op(Angle+Step6) \
- + ##Op(Angle+Step7) \
- + ##Op(Angle+Step8) \
- + ##Op(Angle+Step9); \
- Angle += Increment; \
- } \
- BenchTime = (clock() - StartClock); \
- }
-
- #define MATHOP(Op) \
- { \
- MATHLOOP(Op); \
- SecTime = (double)(BenchTime-Overhead) / CLOCKS_PER_SEC; \
- LoopsPerSec = (long)(Loops * 10 / (BenchTime-Overhead) * CLOCKS_PER_SEC);\
- printf("%10lu in %6.2lf seconds for %10ld " #Op "/s\n", \
- Loops*10, SecTime, LoopsPerSec); \
- }
-
- #define MATHLOOP2(Op1, Op2) \
- { \
- Total = 0.0; \
- StartClock = clock(); \
- for (Loop = Loops; Loop > 0; Loop--) \
- { \
- Total += ##Op1(##Op2(Angle)) \
- + ##Op1(##Op2(Angle+Step1)) \
- + ##Op1(##Op2(Angle+Step2)) \
- + ##Op1(##Op2(Angle+Step3)) \
- + ##Op1(##Op2(Angle+Step4)) \
- + ##Op1(##Op2(Angle+Step5)) \
- + ##Op1(##Op2(Angle+Step6)) \
- + ##Op1(##Op2(Angle+Step7)) \
- + ##Op1(##Op2(Angle+Step8)) \
- + ##Op1(##Op2(Angle+Step9)); \
- Angle += Increment; \
- } \
- BenchTime = (clock() - StartClock); \
- }
-
- #define MATHOP2(Op1, Op2, BaseTime) \
- { \
- MATHLOOP2(Op1, Op2); \
- SecTime = (double)(BenchTime-Overhead-BaseTime) / CLOCKS_PER_SEC; \
- LoopsPerSec = (long)(Loops * 10 / (BenchTime-Overhead-BaseTime) * CLOCKS_PER_SEC); \
- printf("%10lu in %6.2lf seconds for %10ld " #Op1 "/s\n", \
- Loops*10, SecTime, LoopsPerSec); \
- }
-
- #define DEG_PER_RAD (360/(2*3.14159265))
-
- void main(int argc, char *argv[])
- {
- unsigned long Loop, Loops;
- unsigned long StartClock;
- unsigned long BenchTime, LoopsPerSec;
- double Angle, Total, SecTime, Overhead, Increment;
- double Step1, Step2, Step3, Step4, Step5, Step6, Step7, Step8, Step9;
- double SinTime, CosTime, TanTime;
-
- if ( argc > 1 )
- Loops = atol(argv[1]);
- else
- {
- printf("Please give the number of loops on the command line.\n"
- "For 486DX-100 I suggest 200000. Choose a number big enough\n"
- "so that the fastest test takes at least ten seconds.\n");
- exit(1);
- }
-
- Increment = 45.0/DEG_PER_RAD/Loops;
- Angle = Increment;
- Step1 = Increment * 0.1;
- Step2 = Increment * 0.2;
- Step3 = Increment * 0.3;
- Step4 = Increment * 0.4;
- Step5 = Increment * 0.5;
- Step6 = Increment * 0.6;
- Step7 = Increment * 0.7;
- Step8 = Increment * 0.8;
- Step9 = Increment * 0.9;
- MATHLOOP();
- Overhead = BenchTime;
-
- MATHOP(sin);
- SinTime = BenchTime;
- MATHOP(cos);
- CosTime = BenchTime;
- MATHOP(tan);
- TanTime = BenchTime;
- MATHOP2(asin, sin, SinTime);
- MATHOP2(acos, cos, CosTime);
- MATHOP2(atan, tan, TanTime);
-
- MATHOP(log);
- MATHOP(log10);
- }
-
-