在实际使用Super-smack对数据库进行压力测试的时候,我们常常需要控制整数的长度,如最大三位整数(从0-999),三位到7七位整数(从100-9999999)等等。这个时候,gen-data的%d格式又不够用了。分析gen-data的源代码(文件在解压出来的super-smack包的src目录下,gen-data.cc文件),发现虽然产生数字的程序接收了最小宽度和最大宽度参数,但是只是用来获取了一个最终的随机宽度。而这个宽度对最后数据的输出貌似并没有什么影响和控制。虽然搜fprintf()函数中使用到了这个参数。
自己动手丰衣足食,既然原生的代码不能达到我的要求,就帮忙改改吧。改造代码的最终目的,是实现对%d产生的数字的长度控制。
思路:
如前所述,我希望能控制整数长度,3表示3位以内的数,即从0-999.因此,width为3时,最大可接受的值就是999.即:10的4次方-1。因此,只需要采用pow()函数来实现成方,就能得到能接受的最大值。pow()函数在math.h头文件中。
由于gen-data用了rand()函数来获取随机数字,而C++的rand()函数显然没有C#的方便,没有办法直接在函数内部控制最大值和最小值,因此需要自己写算法来控制,对rand()函数产生的结果进行处理,达到控制大小的目的。我们采用取模运算。大家都知道,模运算的结果,绝对不会比除数大。利用这个特性,就能方便的对数字进行处理了。
代码实现:
找到void print_num(int min_width, int max_width)函数,在fprintf()函数前加上以下代码:
double max_num = pow(10,width+1)-1;
max_num = max_num < 0 ? 0 : max_num;
修改fprintf()函数的内容,将rand()修改为rand()%(int)max_num
修改完成的函数如下:
void print_num(int min_width, int max_width)
{
int width = get_width(min_width, max_width);
double max_num = pow(10,width+1)-1;
max_num = max_num < 0 ? 0 : max_num;
if(max_width!=0)
{
fprintf(out, "%*d", width, rand()%(int)max_num);
}
else
{
fprintf(out, "%*d", width, rand());
}
}
代码修改完成之后,保存文件,开始编译。编译命令:
cd super-smack-1.3
./configure --prefix=/usr/local/supersmack --with-mysql=/usr/local/mysql
make
这里要注意:
第一行命令,是进入super-smack-1.3所在的目录,需要根据你的实际文件目录来决定,不要完全照搬我的命令啊。
第二行命令,configure里面的prefix是make install用的,你可以不用加,如果你后面打算make install,你就加上。路径根据实际情况修改。 --with-mysql这里,根据你的实际情况,选择是oracle,mysql还是其他数据库,详细参考./configure --help。至于后面的路径,是你的数据库安装路径,根据实际情况修改。
make完成之后,如果一切顺利,你就可以获取到修改后的gen-data程序了,拷贝覆盖你的旧程序,就可以搞定了。
下面贴几个我机器上的运行结果:
[root@localhost src]# gen-data --help
gen-data version 1.1
MySQL AB, by Sasha Pachev
Prints lines random data to stdout in given format
Usage: gen-data [options]
-?, --help - this message
-V, --version - show version
-n, --num-rows=num - number of rows
-f, --format=fmt_str - format string
Format can contain any character + % followed by
a format specifier. Valid format specifiers:
s - string
d - integer
t - datetime
Additionally, you can prefix a format speficier with:
n - generate exactly n characters
m-n - generate between m and n characters
===========================================================
[root@localhost ~]# gen-data -n 10 -f %3d
43
7
997
39
1
868
682
409
0
55===========================================================
[root@localhost ~]# gen-data -n 10 -f %1-3d
664
268
997
39
253
40
25
409
54
55
如果要把数据结果放文件里面去,可以用以下命令:
gen-data -n 10 -f %1-3d > /root/test.dat