版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、有网文称c标准库的rand/random随机数产生函数性能极差。一直信以为真,但从没做过验证。最近因其他因缘,写了些代码专门验证rand/random的性能。结果大出意料,颠覆之前的成见。结论如下:1) rand/random性极佳。在64位机器上,其性能大约比简单自增略低30%(32位的自增比64位性能高出1倍以上)!2) srand/srandom性能极差极差。绝对不能每次调用rand之前都调用srand。这么做不仅没必要,还会极大降低性能,性能只有调用rand的1%!3) rand文档中提到的实现示例也实际实现存在差别,尤其是srand实现!4) rand的实现起始就是简单的乘法和取模,
2、简单的随机数实现在性能上几乎无法超越系统自带的标准实现!5) 网上的东西很多真是不靠谱!下面测试代码,代码在64/32位机器都能运行。编译命令:g+ -o3 -o test random.cpp 1 #include <stdio.h> 2 #include <stdint.h> 3 #include <vector> 4 #include <algorithm> 5 6 #include <stdlib.h> 7 #include <math.h> 8 9 #include <sys/time.h> 10 1
3、1 12 #define NUM_RAND_SEED 100 13 14 15 class Random 16 17 public: 18 static int srandom(size_t randSeedNum = NUM_RAND_SEED); 19 20 static size_t random(); 21 22 private: 23 static bool m_bInit; 24 static size_t m_count; 25 static std:vector<size_t> m_randSeeds; 26 ; 27 28 bool Random:m_bInit
4、= false; 29 size_t Random:m_count = 0; 30 std:vector<size_t> Random:m_randSeeds; 31 32 int Random:srandom( size_t randSeedNum ) 33 34 m_randSeeds.clear(); 35 36 for(size_t i=0; i< randSeedNum; +i) 37 m_randSeeds.push_back( i ); 38 39 40 std:random_shuffle(m_randSeeds.begin(), m_randSeeds.en
5、d(); 41 m_bInit = true; 42 43 printf("Random:srandomn"); 44 return 0; 45 46 47 size_t Random:random() 48 49 if( ! m_bInit ) 50 srandom(); 51 52 53 static size_t size = m_randSeeds.size(); 54 return 16777619 * m_randSeeds m_count + % size ; 55 56 /return 16777619 * m_randSeeds m_count + % N
6、UM_RAND_SEED ; 57 /return 16777619 * m_randSeeds (m_count +) & 0xffL ; 58 59 60 / 简单随机数 61 int MyRandom() 62 63 static struct timeval tv; 64 static size_t iCount = 0; 65 66 tv.tv_usec += 54321; 67 if( tv.tv_usec > 1000000) 68 tv.tv_usec -= 1000000; 69 70 if( iCount+ % 1000 = 0 ) 71 gettimeofd
7、ay(&tv, NULL); 72 73 74 return tv.tv_usec; 75 76 77 / 自增 78 int Inc() 79 80 static size_t iCount = 0; 81 82 return iCount+; 83 84 85 / 86 87 struct timeval stStartTv; 88 89 /return past time. uint: us 90 long PostTime(struct timeval *pstStartTv) 91 92 struct timeval stEndTv; 93 gettimeofday(&
8、;stEndTv, NULL); 94 struct timeval* pstCurrTv = &stEndTv; 95 96 long sec, usec = 0; 97 sec = pstCurrTv->tv_sec - pstStartTv->tv_sec; 98 if (usec = pstCurrTv->tv_usec - pstStartTv->tv_usec) < 0) 99 sec-;100 usec += 1000000;101 102 usec += sec*1000000;103 104 return usec;105 106 107
9、 void LogPastTime(struct timeval *pstStartTv, const char* sStep)108 109 long usec = PostTime(pstStartTv);110 111 printf("%s: Past time: %ld msn", sStep, usec / 1000);112 113 114 #define STAT_NUM 100115 116 / 自增函数117 void TestInc(size_t count)118 119 gettimeofday(&stStartTv, NULL);120 s
10、ize_t arrCountSTAT_NUM = 0;121 printf("Test Inc.n");122 123 for(size_t i=0; i<count; +i)124 size_t rand = Inc();125 arrCount rand % STAT_NUM +;126 127 128 printf("Total count: %lun", count);129 for(size_t i=0; i<STAT_NUM; +i)130 printf("%lu: count=%lu, ratio=%fn",
11、 i, arrCounti, arrCounti * 1.0 / count);131 132 133 LogPastTime(&stStartTv, "Inc");134 printf("Test Inc.n");135 136 137 / 简单自增138 void TestInc2(size_t count)139 140 gettimeofday(&stStartTv, NULL);141 size_t arrCountSTAT_NUM = 0;142 printf("Test Inc.n");143 144 s
12、tatic size_t icount = 0;145 for(size_t i=0; i<count; +i)146 size_t rand = icount +;147 arrCount rand % STAT_NUM +;148 149 150 printf("Total count: %lun", count);151 for(size_t i=0; i<STAT_NUM; +i)152 printf("%lu: count=%lu, ratio=%fn", i, arrCounti, arrCounti * 1.0 / count)
13、;153 154 155 LogPastTime(&stStartTv, "Inc");156 printf("Test Inc.n");157 158 159 / 160 void TestMyRandom(size_t count)161 162 Random:srandom(); / not cala time163 164 gettimeofday(&stStartTv, NULL);165 size_t arrCountSTAT_NUM = 0;166 printf("Test My Random.n");1
14、67 168 for(size_t i=0; i<count; +i)169 size_t rand = Random:random();170 arrCount rand % STAT_NUM +;171 172 173 printf("Total count: %lun", count);174 for(size_t i=0; i<STAT_NUM; +i)175 printf("%lu: count=%lu, ratio=%fn", i, arrCounti, arrCounti * 1.0 / count);176 177 178 L
15、ogPastTime(&stStartTv, "MyRandom");179 printf("Test My Random.n");180 181 182 / 简单随机数183 void TestSimpleRandom(size_t count)184 185 gettimeofday(&stStartTv, NULL);186 size_t arrCountSTAT_NUM = 0;187 printf("Test Simple Random.n");188 189 for(size_t i=0; i<cou
16、nt; +i)190 size_t rand = MyRandom();191 arrCount rand % STAT_NUM +;192 193 194 printf("Total count: %lun", count);195 for(size_t i=0; i<STAT_NUM; +i)196 printf("%lu: count=%lu, ratio=%fn", i, arrCounti, arrCounti * 1.0 / count);197 198 199 LogPastTime(&stStartTv, "Sim
17、ple Random");200 printf("Test Simple Random.n");201 202 203 / random204 void TestRandom(size_t count)205 206 gettimeofday(&stStartTv, NULL);207 size_t arrCountSTAT_NUM = 0;208 printf("Test Random.n");209 210 for(size_t i=0; i<count; +i)211 size_t rand = random();212 a
18、rrCount rand % STAT_NUM +;213 214 215 printf("Total count: %lun", count);216 for(size_t i=0; i<STAT_NUM; +i)217 printf("%lu: count=%lu, ratio=%fn", i, arrCounti, arrCounti * 1.0 / count);218 219 220 LogPastTime(&stStartTv, "Sys Random");221 printf("Test Rand
19、om.n");222 223 224 / rand225 void TestRand(size_t count)226 227 gettimeofday(&stStartTv, NULL);228 size_t arrCountSTAT_NUM = 0;229 printf("Test Rand.n");230 231 for(size_t i=0; i<count; +i)232 size_t r = rand();233 arrCount r % STAT_NUM +;234 235 236 printf("Total count: %
20、lun", count);237 for(size_t i=0; i<STAT_NUM; +i)238 printf("%lu: count=%lu, ratio=%fn", i, arrCounti, arrCounti * 1.0 / count);239 240 241 LogPastTime(&stStartTv, "Sys Rand");242 printf("Test Rand.n");243 244 245 / 调用srand 和rand246 void TestRand2(size_t coun
21、t)247 248 gettimeofday(&stStartTv, NULL);249 size_t arrCountSTAT_NUM = 0;250 printf("Test Rand (and srand).n");251 252 for(size_t i=0; i<count; +i)253 srand(i);254 size_t r = rand();255 arrCount r % STAT_NUM +;256 257 258 printf("Total count: %lun", count);259 for(size_t i=0; i<STAT_NUM; +i)260 printf("%lu: count=%lu, ratio=%fn", i, arrCounti, arrCounti * 1.0 / count);261 262 263 LogPastTime(&stStartTv, "Sys Rand");264 printf("Test Ran
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 谈声乐教学中范唱的重要作用
- 学校三方协议书(2篇)
- 癌症康复护理服务合同
- 《劳动协议修订》
- 二年级语文教研经验分享总结
- 心理健康工作坊组织制度
- 建筑施工现场职业卫生管理措施
- 医院住院患者营养餐配送方案
- 化工厂事故应急预案与疏散计划
- 新能源项目设备吊装施工方案
- 汽车检测站工作计划(共4篇)
- 药剂科运用PDCA循环减少门诊药房药品调剂差错PDCA成果汇报
- 注射用A型肉毒毒素管理制度
- 甘蔗锤度测定2
- 断路器操作机构的类型
- 临夏河州中学赴江苏南通学习考察报告
- 物品接收单模板(接受联、存根联)
- 英语学术论文写作智慧树知到答案章节测试2023年西安外国语大学
- 16G362 钢筋混凝土结构预埋件
- 设计素描之结构形态造型
- 2023山东新高考英语答题卡 新高考I卷(有听力 )word版
评论
0/150
提交评论