我说过,我还保留单线程处理订票请求的选项。
今天写了一个小程序进行测试。
假设:
路段有1000万个。也就是全国1000万个车站
当然,全国不可能有1000万个车站。但是可以按照路段/车次划分。
也就是全国几个月的车票可以放进去
每趟车不超过56635个座位,用ushort表达。
内存规划:
一共大约20M数据,全部fit进L3 cache。
假定:
还是一次请求20个路段。
初始化:
1000万路段填满,一共超过320亿张票。不知道够不够今后10年的总运量?
访问模式:
尽量避免L1和L2 cache hit。每个循环每路段逐一访问,最大可能造成L1,L2 miss。
结果:
如下程序:
循环:5000 × 10000000 / 20 = 2500000000
用时:49.86s
2500000000 / 49.86 = 50.14M TPS。
程序如下:
unsigned short data[10000000];
bool reserveTicket(unsigned short *line, int start, int len) {
unsigned short *p = line + start;
for (int i=0; iif (*p == 0)
return false;
p++;
}
p = line + start;
for (int i=0; i(*p)--;
p++;
}
return true;
}
int main(int argc, char *argv[]) {
for (int i=0; i<10000000; i++) {
data[i] = 65535;
}
teraspaces::qwframework::DateTime t1 = teraspaces::qwframework::DateTime::
utcNow();
for (int i=0; i<5000; i++) {
unsigned short *curLine = data;
for (int j=0; j<10000000 / 20; j++) {
bool res = reserveTicket(curLine, 0, 20);
if (!res) {
printf("Failed!\n");
}
curLine += 20;
}
}
teraspaces::qwframework::DateTime t2 = teraspaces::qwframework::DateTime::
utcNow();
printf("Total seconds %f\n", (t2-t1).totalSeconds());
return 0;
』