- 注册时间
- 2007-12-26
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 92657
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
摘要转载自:http://topic.csdn.net/u/20080226 ... 5-a609c5c88f9c.html
以下代码是我在yaos原测试代码基础上略作修改得到的:- #include <stdio.h>
- #include <tchar.h>
- #include <windows.h>
- #include <stdlib.h>
- #include <time.h>
- #include "Include/gmp.h"
- #include "Include/HugeCalc.h"
- #include "Include/HugeIntX.h"
- #pragma comment( lib, "lib/libgmp-3.lib" /*"lib/gmp.lib"*/ )
- #pragma comment( lib, "lib/HugeCalc.lib" )
- unsigned long sizeList[] = {256, 512, 1024, 1536, 2048, 3072, 4096,
- 8192, 10240, 16384, 64000, 65536, 256000, 512000, 1048576, 33554432, 0x4000000, 0x6000000/*, 0x8000000, 0xC000000*/};
- char hexChar[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
- bool showLastErr( void )
- {
- bool bErr = TRUE;
- switch( HugeCalc::GetLastError() )
- {
- case HCERR_NO_LICENSE:
- printf("Last Error: HCERR_NO_LICENSE\n");
- break;
- case HCERR_USER_STOP:
- printf("Last Error: HCERR_USER_STOP\n");
- break;
- case HCERR_NO_ENOUGH_MEMORY:
- printf("Last Error: HCERR_NO_ENOUGH_MEMORY\n");
- break;
- case HCERR_INVALID_POINTER:
- printf("Last Error: HCERR_INVALID_POINTER\n");
- break;
- case HCERR_DIV_ZERO:
- printf("Last Error: HCERR_DIV_ZERO\n");
- break;
- case HCERR_BASE2SMALL:
- printf("Last Error: HCERR_BASE2SMALL\n");
- break;
- case HCERR_RADIX2SMALL:
- printf("Last Error: HCERR_RADIX2SMALL\n");
- break;
- case HCERR_NONE:
- case HCERR_UNKNOWN:
- default:
- bErr = FALSE;
- }
- return bErr;
- }
- void RandomStr(char *p, int sizes) //随机填充16进制数字
- {
- srand(GetTickCount());
- p[0] = 'F'; //保证达到特定大小
- for (int i = 1; i < sizes; i ++)
- {
- p[i] = hexChar[rand() % 16];
- }
- }
- int main(int argc, _TCHAR* argv[])
- {
- mpz_t gmp_a, gmp_b, gmp_c;
- CHugeIntX huge_a, huge_b, huge_c;
- LARGE_INTEGER CountFreq, start, stop;
- double UsedTime;
- int mult;//重复次数
- int i, j;
- char *pA, *pB;
- QueryPerformanceFrequency(&CountFreq);
- SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
- //初始化
- mpz_init(gmp_a);
- mpz_init(gmp_b);
- mpz_init(gmp_c);
- #if 1
- # define _RATIO 10UL /* 被乘数与乘数长度之比 */
- #else
- # define _RATIO 1UL /* 被乘数与乘数长度之比 */
- #endif
- printf("*** 被乘数与乘数长度之比为:%d ***\n\n", _RATIO);
- i = sizeof(sizeList)/sizeof(sizeList[0]);
- j = sizeList[i-1] / 4;
- pA = (char *)malloc( j + 1 );
- RandomStr(pA, j);
- j /= _RATIO;
- pB = (char *)malloc( j + 1 );
- RandomStr(pB, j);
- for (i = 0; i < sizeof(sizeList)/sizeof(sizeList[0]); i ++)
- {
- printf("现在计算长度(bits): %d\n", sizeList[i]);
- // 设定字串终止符
- j = sizeList[i] / 4;
- pA[j] = '\0';
- pB[j/_RATIO] = '\0';
- if (sizeList[i] < 10000) mult = 1000; else mult = 1;
- //GMP Test
- mpz_set_str(gmp_a, pA, 16);
- mpz_set_str(gmp_b, pB, 16);
- QueryPerformanceCounter(&start);
- for (j = 0; j < mult; j ++)
- mpz_mul(gmp_c, gmp_a, gmp_b);
- QueryPerformanceCounter(&stop);
- UsedTime = (double)(stop.QuadPart - start.QuadPart) * 1000000.0 / (double)CountFreq.QuadPart / (double)mult;
- // printf( " gmp_c have %u bits\n", mpz_sizeinbase( gmp_c, 2 ) );
- printf(" GMP 包计算时间(us):%.3f\n", UsedTime);
- // 释放内存
- mpz_set_ui( gmp_a, 0 );
- mpz_set_ui( gmp_b, 0 );
- mpz_set_ui( gmp_c, 0 );
- //HugeCalc Test
- huge_a.SetHexStr((LPCTSTR)pA);
- huge_b.SetHexStr((LPCTSTR)pB);
- QueryPerformanceCounter(&start);
- for (j = 0; j < mult; j ++)
- huge_c.Mul(huge_a, huge_b);
- QueryPerformanceCounter(&stop);
- UsedTime = (double)(stop.QuadPart - start.QuadPart) * 1000000.0 / (double)CountFreq.QuadPart / (double)mult;
- // printf( "huge_c have %u bits\n", huge_c.GetBits() );
- printf(" HugeCalc包计算时间(us):%.3f\n", UsedTime);
- if ( showLastErr() )
- break;
- // 释放内存
- huge_c = huge_a = huge_b = 0;
- // 将字串终止符恢复成16进制数字
- j = sizeList[i] / 4;
- pA[j] = hexChar[rand() % 16];
- pB[j/_RATIO] = hexChar[rand() % 16];
- }
- free( pA );
- free( pB );
- mpz_clear(gmp_a);
- mpz_clear(gmp_b);
- mpz_clear(gmp_c);
- system( "pause" );
- return 0;
- }
复制代码 测试结果如下:- *** 被乘数与乘数长度之比为:10 ***
- 现在计算长度(bits): 256
- GMP 包计算时间(us):0.048
- HugeCalc包计算时间(us):0.330
- 现在计算长度(bits): 512
- GMP 包计算时间(us):0.133
- HugeCalc包计算时间(us):0.354
- 现在计算长度(bits): 1024
- GMP 包计算时间(us):0.347
- HugeCalc包计算时间(us):0.614
- 现在计算长度(bits): 1536
- GMP 包计算时间(us):0.608
- HugeCalc包计算时间(us):1.132
- 现在计算长度(bits): 2048
- GMP 包计算时间(us):1.047
- HugeCalc包计算时间(us):1.792
- 现在计算长度(bits): 3072
- GMP 包计算时间(us):2.115
- HugeCalc包计算时间(us):4.024
- 现在计算长度(bits): 4096
- GMP 包计算时间(us):3.532
- HugeCalc包计算时间(us):6.530
- 现在计算长度(bits): 8192
- GMP 包计算时间(us):18.964
- HugeCalc包计算时间(us):21.784
- 现在计算长度(bits): 10240
- GMP 包计算时间(us):37.994
- HugeCalc包计算时间(us):38.832
- 现在计算长度(bits): 16384
- GMP 包计算时间(us):67.048
- HugeCalc包计算时间(us):86.324
- 现在计算长度(bits): 64000
- GMP 包计算时间(us):676.622
- HugeCalc包计算时间(us):1481.753
- 现在计算长度(bits): 65536
- GMP 包计算时间(us):607.060
- HugeCalc包计算时间(us):1387.048
- 现在计算长度(bits): 256000
- GMP 包计算时间(us):4379.328
- HugeCalc包计算时间(us):5920.026
- 现在计算长度(bits): 512000
- GMP 包计算时间(us):11874.973
- HugeCalc包计算时间(us):12876.776
- 现在计算长度(bits): 1048576
- GMP 包计算时间(us):35291.357
- HugeCalc包计算时间(us):26408.384
- 现在计算长度(bits): 33554432
- GMP 包计算时间(us):1331961.464
- HugeCalc包计算时间(us):1184980.773
- 现在计算长度(bits): 67108864
- GMP 包计算时间(us):3154349.226
- HugeCalc包计算时间(us):2320234.555
- 现在计算长度(bits): 100663296
- GMP 包计算时间(us):4559124.414
- HugeCalc包计算时间(us):4328886.772
- 请按任意键继续. . .
复制代码 测试环境:Windows XP SP2,AMD Athlon 64 Processor 3200+,1GB DDR - 200MHz
通过原帖对最最核心算法的测试数据表明:
1、即便在单核上,HugeCalc一样可以击败号称“地球上最快”的大数库GMP;
2、在多核上,HugeCalc可领先更多;
3、HugeCalc需要对小规模计算算法进一步提速;
4、HugeCalc效率最高的接口方式是C++静态导入,而后是C动态导入,最后是TLB形式;
5、还可以总结更多的。。。
需进一步说明的是:
3、——这与HugeCalc需实时检测退出标志,从而可实时响应用户终止计算请求有关;当然代码应还有优化余地;
4、——导出tlb形式的COM接口源于C接口-->C接口又源于C++接口;且C接口采用了“内部全程自动监控各函数出入口变量机制”而使效率略有折扣,但换来的是系统的安全稳定,值!
比如下段代码:- HHUGEINTX hResult;
- HCErrCode lastErr;
- hResult = new_HX(); (1)
- HI_set_u32( hResult, 1 ); (2)
- HI_decLShift( hResult, 100 ); (3)
- lastErr = HC_getLastError(); (4)
复制代码 上述代码虽然可以通过编译;但运行时,lastErr 将返回 HCERR_INVALID_POINTER,其实该问题首次产生于语句(2),语句(3)也有问题,这样以帮助开发者调试程序。
关于测试源代码、运行动态库及编译好的测试程序,打包如下:
GMPvsHC.rar
(451.62 KB, 下载次数: 42)
(请注意阅读压缩包上的注释) |
|