在分析我的应用程序时,我意识到在字符串比较上花了很多时间.所以我写了一个简单的基准测试,我很惊讶'=='比string :: compare和strcmp慢得多!这是代码,谁能解释为什么呢?或者我的代码有什么问题?因为根据标准'=='只是一个运算符重载而只是返回!lhs.compare(rhs).
#include <iostream>
#include <vector>
#include <string>
#include <stdint.h>
#include "Timer.h"
#include <random>
#include <time.h>
#include <string.h>
using namespace std;
uint64_t itr = 10000000000;//10 Billion
int len = 100;
int main() {
srand(time(0));
string s1(len,random()%128);
string s2(len,random()%128);
uint64_t a = 0;
Timer t;
t.begin();
for(uint64_t i =0;i<itr;i++){
if(s1 == s2)
a = i;
}
t.end();
cout<<"== took:"<<t.elapsedMillis()<<endl;
t.begin();
for(uint64_t i =0;i<itr;i++){
if(s1.compare(s2)==0)
a = i;
}
t.end();
cout<<".compare took:"<<t.elapsedMillis()<<endl;
t.begin();
for(uint64_t i =0;i<itr;i++){
if(strcmp(s1.c_str(),s2.c_str()))
a = i;
} …Run Code Online (Sandbox Code Playgroud) 我想生成从[a,b]之间的特定分布(例如,均匀随机)中抽取的N个随机数,它们总和为常数C.我尝试了几种我能想到的解决方案,有些提议在类似的线程但是他们中的大多数要么是为有限形式的问题工作,要么我无法证明结果仍然遵循预期的分布.
我尝试过:生成N个随机数,将它们全部除以它们的总和并乘以所需的常数.这似乎有效,但结果并不遵循数字应在[a:b]范围内的规则.
Generage N-1随机数加0和期望的常数C并对它们进行排序.然后计算每两个连续nubmers之间的差异,结果是差异.这再次总结为C但是具有与最后一个方法相同的问题(范围可以大于[a:b].
我还尝试生成随机数,并始终以保持所需总和和范围的方式跟踪最小值和最大值,并提供此代码:
bool generate(function<int(int,int)> randomGenerator,int min,int max,int len,int sum,std::vector<int> &output){
/**
* Not possible to produce such a sequence
*/
if(min*len > sum)
return false;
if(max*len < sum)
return false;
int curSum = 0;
int left = sum - curSum;
int leftIndexes = len-1;
int curMax = left - leftIndexes*min;
int curMin = left - leftIndexes*max;
for(int i=0;i<len;i++){
int num = randomGenerator((curMin< min)?min:curMin,(curMax>max)?max:curMax);
output.push_back(num);
curSum += num;
left = sum - curSum;
leftIndexes--;
curMax = left - …Run Code Online (Sandbox Code Playgroud)