-
mysql分页SQL性能对比
2011-12-19 20:03:47
为了验证网上说的分页SQL语句性能的好与坏,现在做一个对比测试
1、场景描述:
1)、测试单个表数据 680万
2)、表结构一样
3)、数据库 mysql5.5
2、测试结果
2.1)比较好分页语句
SELECT * FROM score s WHERE s.id > 4000000 ORDER BY s.id LIMIT 10 ;
执行时间为: 0.02322秒左右
2.2)比较差的分页语句
SELECT * FROM score WHERE sid = 2 AND id >= (
SELECT id FROM score ORDER BY id LIMIT 4000000, 1
) LIMIT 10 ;
执行时间为: 4.88秒左右
2.3)比较差的语句
SELECT * FROM score S ORDER BY S.id LIMIT 4000000,10
6.266秒左右
3、结论:
其实SQL语句优化还是比较重要的,好的SQL语句可以提升系统不少的性能,但是第一个SQL语句,如果s.id 不是连续的,使用起来还是比较困难吧。个人感觉。。。
实践是检验真理的唯一方法,不实践就没有发言权!
欢迎大家讨论,对知识有自己的看法。。。
-
Nginx and apache 性能测试对比
2011-12-17 00:15:03
Nginx and apache 性能测试对比总体的感觉Nginx性能在静态页面处理能力上,还是比apache性能好一点,性能大概在18%左右的差距。本次小测试只是为了比较那个软件在默认参数情况下的性能表现。下面看我的总体测试结果。1、测试目的测试apache ,Nginx在静态页面下,性能对比2、场景描述并发: 20用户运行时间:05分:19秒脚本: 分别打开静态页面,页面内容都相同测试硬件:都一样的3、测试结果+++++++++++++++++++++++++++++
系统资源使用率
ngnix cpu : 100% mem: 1.24-1.19 thread : 2
apache cpu : 100% mem: 1.09-1.15G thread : 2 httpd.exe+++++++++++++++++++++++++++++
TPS: ngnix:390-990 apache: 711-730
响应时间: ngnix:0.011 apache: 0.014s
网络吞吐量: ngnix: 170000-420000 apache: 314600-314900Byte
事务总量 : ngnix: 263027 apache: 222795
运行时间: ngnix:05:19 apache: 05:194、Loadrunner统计结果 -
PHP Socket (实现http get 请求)
2011-12-14 13:44:52
1、通过PHP socket实现 http get请求
目的:学习PHP - socket 通信过程
2、 开发socket 注意的问题
1)socket_send and socket_recv
第四个参数一般都写0就可以的,如果按PHP的帮助文档中写如下的参数如:
MSG_OOB Send OOB (out-of-band) data. MSG_EOR Indicate a record mark. The sent data completes the record. MSG_EOF Close the sender side of the socket and include an appropriate notification of this at the end of the sent data. The sent data completes the transaction. MSG_DONTROUTE Bypass routing, use direct interface.
都会出现下面的错误
Warning: socket_recv() [function.socket-recv]: unable to read from socket [0]: 操作成功完成。 in D:\phpwork\fsoap\socket\aa.php on line 30
buf1 out put2)php_sockets.dll 无法加载问题
可以直接用命令 dl(); 方式加载
3、具体的代码实现如下。
<?php
/*
DATE: 2011-12-14
AUTHOR: I see
Function: 通过Socket 实现 http get 请求。
*/
dl('php_sockets.dll');
set_time_limit(0);
error_reporting(E_ALL);
$service_port=9080;
$address="192.168.37.22";
//创建socket
if (false == ($socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}
//创建链接
$result=socket_connect($socket,$address,$service_port);$InfoStr = "GET /umsrest/rs/users/getUserByName?userName=test_fang@163.com HTTP/1.1\r\n";
$InfoStr .= "Host: 192.168.37.22:9080 \r\n";
$InfoStr .= "Connection: Close\r\n\r\n";
//发送数据
socket_send($socket,$InfoStr,strlen($InfoStr),0);
//接受数据
socket_recv($socket,$buf1,9000,0);
//打印数据
echo 'buf1 out put '.$buf1 ;
//关闭链接
socket_close($socket);
?> -
SED 单行脚本快速参考
2011-12-12 16:31:56
《SED 单行脚本快速参考》
常用命令总结:
sed –I ‘1d’ aa.txt //删除文件第一次
$ sed '$d' aa.txt //删除aa.txt文件的最后一行。
Sed ‘/test/’d aa.txt //删除 test所有的行
sed G //在每一行后面增加一空行
sed 'G;G' //在每一行后面增加两行空行
sed –n ‘1,10’ aa.txt //打印出文件前10行
tail -10 aa.txt //显示文件后10行
head -10 aa.txt //显示文件的前10行
sed –I ‘s/Test/Fuck/g’ aa.txt //在全文中查询Test 并替换成 Fuck ,-I 是写入到文件中
sed '/test/'d aa.txt 删除example文件所有包含test的行。
SED 单行脚本快速参考 2005年12月29日
英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor) 整理:Eric Pement - 电邮:pemente[at]northpark[dot]edu 版本5.5 译者:Joe Hong - 电邮:hq00e[at]126[dot]com 在以下地址可找到本文档的最新(英文)版本: http://sed.sourceforge.net/sed1line.txt [1] http://www.pement.org/sed/sed1line.txt 其他语言版本: 中文 - http://sed.sourceforge.net/sed1line_zh-CN.html 捷克语 - http://sed.sourceforge.net/sed1line_cz.html 荷语 - http://sed.sourceforge.net/sed1line_nl.html 法语 - http://sed.sourceforge.net/sed1line_fr.html 德语 - http://sed.sourceforge.net/sed1line_de.html 葡语 - http://sed.sourceforge.net/sed1line_pt-BR.html文本间隔:
-------- # 在每一行后面增加一空行 sed G # 将原来的所有空行删除并在每一行后面增加一空行。 # 这样在输出的文本中每一行后面将有且只有一空行。 sed '/^$/d;G' # 在每一行后面增加两行空行 sed 'G;G' # 将第一个脚本所产生的所有空行删除(即删除所有偶数行) sed 'n;d' # 在匹配式样“regex”的行之前插入一空行 sed '/regex/{x;p;x;}' # 在匹配式样“regex”的行之后插入一空行 sed '/regex/G' # 在匹配式样“regex”的行之前和之后各插入一空行 sed '/regex/{x;p;x;G;}'编号:
-------- # 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符” # (tab,见本文末尾关于'\t'的用法的描述)而不是空格来对齐边缘。 sed = filename | sed 'N;s/\n/\t/' # 对文件中的所有行编号(行号在左,文字右端对齐)。 sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 对文件中的所有行编号,但只显示非空白行的行号。 sed '/./=' filename | sed '/./N; s/\n/ /' # 计算行数 (模拟 "wc -l") sed -n '$='文本转换和替代:
-------- # Unix环境:转换DOS的新行符(CR/LF)为Unix格式。 sed 's/.$//' # 假设所有行以CR/LF结束 sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V sed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本 # Unix环境:转换Unix的新行符(LF)为DOS格式。 sed "s/$/`echo -e \\\r`/" # 在ksh下所使用的命令 sed 's/$'"/`echo \\\r`/" # 在bash下所使用的命令 sed "s/$/`echo \\\r`/" # 在zsh下所使用的命令 sed 's/$/\r/' # gsed 3.02.80 及更高版本 # DOS环境:转换Unix新行符(LF)为DOS格式。 sed "s/$//" # 方法 1 sed -n p # 方法 2 # DOS环境:转换DOS新行符(CR/LF)为Unix格式。 # 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的 # sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看 # 其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS # 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。 sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本 tr -d \r <infile >outfile # GNU tr 1.22 或更高版本 # 将每一行前导的“空白字符”(空格,制表符)删除 # 使之左对齐 sed 's/^[ \t]*//' # 见本文末尾关于'\t'用法的描述 # 将每一行拖尾的“空白字符”(空格,制表符)删除 sed 's/[ \t]*$//' # 见本文末尾关于'\t'用法的描述 # 将每一行中的前导和拖尾的空白字符删除 sed 's/^[ \t]*//;s/[ \t]*$//' # 在每一行开头处插入5个空格(使全文向右移动5个字符的位置) sed 's/^/ /' # 以79个字符为宽度,将所有文本右对齐 sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78个字符外加最后的一个空格 # 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前 # 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充 # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。 sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1 sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # 方法2 # 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar” sed 's/foo/bar/' # 只替换每一行中的第一个“foo”字串 sed 's/foo/bar/4' # 只替换每一行中的第四个“foo”字串 sed 's/foo/bar/g' # 将每一行中的所有“foo”都换成“bar” sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo” sed 's/\(.*\)foo/\1bar/' # 替换最后一个“foo” # 只在行中出现字串“baz”的情况下将“foo”替换成“bar” sed '/baz/s/foo/bar/g' # 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换 sed '/baz/!s/foo/bar/g' # 不管是“scarlet”“ruby”还是“puce”,一律换成“red” sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数的sed都有效 gsed 's/scarlet\|ruby\|puce/red/g' # 只对GNU sed有效 # 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。 # 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除 sed '1!G;h;$!d' # 方法1 sed -n '1!G;h;$p' # 方法2 # 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”) sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' # 将每两行连接成一行(类似“paste”) sed '$!N;s/\n/ /' # 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾 # 并去掉原来行尾的反斜杠 sed -e :a -e '/\\$/N; s/\\\n//; ta' # 如果当前行以等号开头,将当前行并到上一行末尾 # 并以单个空格代替原来行头的“=” sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' # 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567” gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed # 为带有小数点和负号的数值增加逗号分隔符(GNU sed) gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9])/\1\2,\3/g;ta' # 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行) gsed '0~5G' # 只对GNU sed有效 sed 'n;n;n;n;G;' # 其他sed选择性地显示特定行:
-------- # 显示文件中的前10行 (模拟“head”的行为) sed 10q # 显示文件中的第一行 (模拟“head -1”命令) sed q # 显示文件中的最后10行 (模拟“tail”) sed -e :a -e '$q;N;11,$D;ba' # 显示文件中的最后2行(模拟“tail -2”命令) sed '$!N;$!D' # 显示文件中的最后一行(模拟“tail -1”) sed '$!d' # 方法1 sed -n '$p' # 方法2 # 显示文件中的倒数第二行 sed -e '$!{h;d;}' -e x # 当文件中只有一行时,输入空行 sed -e '1{$q;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,显示该行 sed -e '1{$d;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,不输出 # 只显示匹配正则表达式的行(模拟“grep”) sed -n '/regexp/p' # 方法1 sed '/regexp/!d' # 方法2 # 只显示“不”匹配正则表达式的行(模拟“grep -v”) sed -n '/regexp/!p' # 方法1,与前面的命令相对应 sed '/regexp/d' # 方法2,类似的语法 # 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行 sed -n '/regexp/{g;1!p;};h' # 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行 sed -n '/regexp/{n;p;}' # 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所 # 在行的行号 (类似“grep -A1 -B1”) sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h # 显示包含“AAA”、“BBB”或“CCC”的行(任意次序) sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影响结果 # 显示包含“AAA”、“BBB”和“CCC”的行(固定次序) sed '/AAA.*BBB.*CCC/!d' # 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”) sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多数sed gsed '/AAA\|BBB\|CCC/!d' # 对GNU sed有效 # 显示包含“AAA”的段落 (段落间以空行分隔) # HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' # 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序) sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d' # 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序) sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # 只对GNU sed有效 # 显示包含65个或以上字符的行 sed -n '/^.\{65\}/p' # 显示包含65个以下字符的行 sed -n '/^.\{65\}/!p' # 方法1,与上面的脚本相对应 sed '/^.\{65\}/d' # 方法2,更简便一点的方法 # 显示部分文本——从包含正则表达式的行开始到最后一行结束 sed -n '/regexp/,$p' # 显示部分文本——指定行号范围(从第8至第12行,含8和12行) sed -n '8,12p' # 方法1 sed '8,12!d' # 方法2 # 显示第52行 sed -n '52p' # 方法1 sed '52!d' # 方法2 sed '52q;d' # 方法3, 处理大文件时更有效率 # 从第3行开始,每7行显示一次 gsed -n '3~7p' # 只对GNU sed有效 sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed # 显示两个正则表达式之间的文本(包含) sed -n '/Iowa/,/Montana/p' # 区分大小写方式选择性地删除特定行:
-------- # 显示通篇文档,除了两个正则表达式之间的内容 sed '/Iowa/,/Montana/d' # 删除文件中相邻的重复行(模拟“uniq”) # 只保留重复行中的第一行,其他行删除 sed '$!N; /^\(.*\)\n\1$/!P; D' # 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存 # 大小,或者使用GNU sed。 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' # 删除除重复行外的所有行(模拟“uniq -d”) sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' # 删除文件中开头的10行 sed '1,10d' # 删除文件中的最后一行 sed '$d' # 删除文件中的最后两行 sed 'N;$!P;$!D;$d' # 删除文件中的最后10行 sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1 sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2 # 删除8的倍数行 gsed '0~8d' # 只对GNU sed有效 sed 'n;n;n;n;n;n;n;d;' # 其他sed # 删除匹配式样的行 sed '/pattern/d' # 删除含pattern的行。当然pattern # 可以换成任何有效的正则表达式 # 删除文件中的所有空行(与“grep '.' ”效果相同) sed '/^$/d' # 方法1 sed '/./!d' # 方法2 # 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。 # (模拟“cat -s”) sed '/./,/^$/!d' #方法1,删除文件顶部的空行,允许尾部保留一空行 sed '/^$/N;/\n$/D' #方法2,允许顶部保留一空行,尾部不留空行 # 只保留多个相邻空行的前两行。 sed '/^$/N;/\n$/N;//D' # 删除文件顶部的所有空行 sed '/./,$!d' # 删除文件尾部的所有空行 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 对所有sed有效 sed -e :a -e '/^\n*$/N;/\n$/ba' # 同上,但只对 gsed 3.02.*有效 # 删除每个段落的最后一行 sed -n '/^$/{p;h;};/./{x;/./p;}'特殊应用:
-------- # 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使 # 用'echo'命令时可能需要加上 -e 选项。 sed "s/.`echo \\\b`//g" # 外层的双括号是必须的(Unix环境) sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H sed 's/.\x08//g' # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法 # 提取新闻组或 e-mail 的邮件头 sed '/^$/q' # 删除第一行空行后的所有内容 # 提取新闻组或 e-mail 的正文部分 sed '1,/^$/d' # 删除第一行空行之前的所有内容 # 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样 sed '/^Subject: */!d; s///;q' # 从邮件头获得回复地址 sed '/^Reply-To:/q; /^From:/h; /./d;g;q' # 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮 # 地址的部分剃除。(见上一脚本) sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//' # 在每一行开头加上一个尖括号和空格(引用信息) sed 's/^/> /' # 将每一行开头处的尖括号和空格删除(解除引用) sed 's/^> //' # 移除大部分的HTML标签(包括跨行标签) sed -e :a -e 's/<[^>]*>//g;/</N;//ba' # 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。 # 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入; # 第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一 # 个脚本修改而来。) sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1 sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2 # 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用 # 字元“\v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也可以 # 用其他未在文件中使用的字符来代替它。 sed '/./{H;d;};x;s/\n/==/g' file | sort | sed '1s/==//;s/==/\n/g' gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/' # 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件 # 命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b” # 显示不带路径的文件名)。 echo @echo off >zipup.bat dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat -
uptime load average 真实含义
2011-12-09 10:35:14
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满 足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用'wait')
- 没有被停止(例如:等待终止)
例如: root@CMS3:~# uptime
10:38:20 up 115 days, 17:16, 4 users, load average: 17.03, 17.04, 17.00命令输出的最后内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
一般来说只要每个CPU的当前活动进程数不大于1那么系统的性能就是良好的,如 果每个CPU的任务数大于1,那么就表示这台机器的性能有严重问题。
对 于上面的例子 来说,假设系统有4个CPU,那么其每个CPU的当前任务数为:17/4=4.25。这表示该系统的性能已经出现了问题的,通过查看cpu使用情况发现,
PID USER PR NI VIRT RES SHR S %CPU %MEM COMMAND
4970 root 20 0 1498m 739m 9420 S 401 18.3 /usr/bin/java -Djava.util.logging.config.file=/usr/lojava 进程使用CPU的比例在 401%这说明了4个CPU全部让这个服务给占用了。
这种情况下,说明了系统已经出现了瓶颈点,这个点是什么?至少说CPU已经承受不了,具体的原因,可能是在代码上面或是压力过大造成的,要分析了。至少通过监控,发出了CPU,已经是本次测试的瓶颈点。
再看一个没有压力情况下的系统的负载情况
root@CMS1:~# uptime
10:59:23 up 36 days, 17:57, 9 users, load average: 0.09, 0.11, 0.09大家看一下这个没有压力情况下, load average: 0.09, 0.11, 0.09 也是四个CPU的系统,负载情况
在Linux系统中,uptime、w、top等命令都会有系统平均负载load average的输出
-
javascript知识整理
2011-12-07 14:49:09
1.javascript的数组API
- //定义数组
- var pageIds = new Array();
- pageIds.push('A');
- 数组长度
- pageIds.length;
- //shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined
- var a = [1,2,3,4,5];
- var b = a.shift(); //a:[2,3,4,5] b:1
- //unshift:将参数添加到原数组开头,并返回数组的长度
- var a = [1,2,3,4,5];
- var b = a.unshift(-2,-1); //a:[-2,-1,1,2,3,4,5] b:7
- //注:在IE6.0下测试返回值总为undefined,FF2.0下测试返回值为7,所以这个方法的返回值不可靠,需要用返回值时可用splice代替本方法来使用。
- //pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined
- var a = [1,2,3,4,5];
- var b = a.pop(); //a:[1,2,3,4] b:5
- //push:将参数添加到原数组末尾,并返回数组的长度
- var a = [1,2,3,4,5];
- var b = a.push(6,7); //a:[1,2,3,4,5,6,7] b:7
- //concat:返回一个新数组,是将参数添加到原数组中构成的
- var a = [1,2,3,4,5];
- var b = a.concat(6,7); //a:[1,2,3,4,5] b:[1,2,3,4,5,6,7]
- //splice(start,deleteCount,val1,val2,):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,
- var a = [1,2,3,4,5];
- var b = a.splice(2,2,7,8,9); //a:[1,2,7,8,9,5] b:[3,4]
- var b = a.splice(0,1); //同shift
- a.splice(0,0,-2,-1); var b = a.length; //同unshift
- var b = a.splice(a.length-1,1); //同pop
- a.splice(a.length,0,6,7); var b = a.length; //同push
- //reverse:将数组反序
- var a = [1,2,3,4,5];
- var b = a.reverse(); //a:[5,4,3,2,1] b:[5,4,3,2,1]
- //sort(orderfunction):按指定的参数对数组进行排序
- var a = [1,2,3,4,5];
- var b = a.sort(); //a:[1,2,3,4,5] b:[1,2,3,4,5]
- //slice(start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组
- var a = [1,2,3,4,5];
- var b = a.slice(2,5); //a:[1,2,3,4,5] b:[3,4,5]
- //join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符
- var a = [1,2,3,4,5];
- var b = a.join("|"); //a:[1,2,3,4,5] b:"1|2|3|4|5"
//定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.length; //shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5] b:1 //unshift:将参数添加到原数组开头,并返回数组的长度 var a = [1,2,3,4,5]; var b = a.unshift(-2,-1); //a:[-2,-1,1,2,3,4,5] b:7 //注:在IE6.0下测试返回值总为undefined,FF2.0下测试返回值为7,所以这个方法的返回值不可靠,需要用返回值时可用splice代替本方法来使用。 //pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.pop(); //a:[1,2,3,4] b:5 //push:将参数添加到原数组末尾,并返回数组的长度 var a = [1,2,3,4,5]; var b = a.push(6,7); //a:[1,2,3,4,5,6,7] b:7 //concat:返回一个新数组,是将参数添加到原数组中构成的 var a = [1,2,3,4,5]; var b = a.concat(6,7); //a:[1,2,3,4,5] b:[1,2,3,4,5,6,7] //splice(start,deleteCount,val1,val2,):从start位置开始删除deleteCount项,并从该位置起插入val1,val2, var a = [1,2,3,4,5]; var b = a.splice(2,2,7,8,9); //a:[1,2,7,8,9,5] b:[3,4] var b = a.splice(0,1); //同shift a.splice(0,0,-2,-1); var b = a.length; //同unshift var b = a.splice(a.length-1,1); //同pop a.splice(a.length,0,6,7); var b = a.length; //同push //reverse:将数组反序 var a = [1,2,3,4,5]; var b = a.reverse(); //a:[5,4,3,2,1] b:[5,4,3,2,1] //sort(orderfunction):按指定的参数对数组进行排序 var a = [1,2,3,4,5]; var b = a.sort(); //a:[1,2,3,4,5] b:[1,2,3,4,5] //slice(start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组 var a = [1,2,3,4,5]; var b = a.slice(2,5); //a:[1,2,3,4,5] b:[3,4,5] //join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符 var a = [1,2,3,4,5]; var b = a.join("|"); //a:[1,2,3,4,5] b:"1|2|3|4|5"
2.dom最常用API
- document方法:
- getElementById(id) Node 返回指定结点的引用
- getElementsByTagName(name) NodeList 返回文档中所有匹配的元素的集合
- createElement(name) Node Node
- createTextNode(text) Node 创建一个纯文本结点
- ownerDocument Document 指向这个节点所属的文档
- documentElement Node 返回html节点
- document.body Node 返回body节点
- element方法:
- getAttribute(attributeName) String 返回指定属性的值
- setAttribute(attributeName,value) String 给属性赋值
- removeAttribute(attributeName) String 移除指定属性和它的值
- getElementsByTagName(name) NodeList 返回结点内所有匹配的元素的集合
- node方法:
- appendChild(child) Node 给指定结点添加一个新的子结点
- removeChild(child) Node 移除指定结点的子结点
- replaceChild(newChild,oldChild) Node 替换指定结点的子结点
- insertBefore(newChild,refChild) Node 在同一层级的结点前面插入新结点
- hasChildNodes() Boolean 如果结点有子结点则返回true
- node属性:
- nodeName String 以字符串的格式存放结点的名称
- nodeType String 以整型数据格式存放结点的类型
- nodeValue String 以可用的格式存放结点的值
- parentNode Node 指向结点的父结点的引用
- childNodes NodeList 指向子结点的引用的集合
- firstChild Node 指向子结点结合中的第一个子结点的引用
- lastChild Node 指向子结点结合中的最后一个子结点的引用
- previousSibling Node 指向前一个兄弟节点;如果这个节点就是兄弟节点,那么该值为null
- nextSibling Node 指向后一个兄弟节点;如果这个节点就是兄弟节点,那么该值为null
document方法: getElementById(id) Node 返回指定结点的引用 getElementsByTagName(name) NodeList 返回文档中所有匹配的元素的集合 createElement(name) Node Node createTextNode(text) Node 创建一个纯文本结点 ownerDocument Document 指向这个节点所属的文档 documentElement Node 返回html节点 document.body Node 返回body节点 element方法: getAttribute(attributeName) String 返回指定属性的值 setAttribute(attributeName,value) String 给属性赋值 removeAttribute(attributeName) String 移除指定属性和它的值 getElementsByTagName(name) NodeList 返回结点内所有匹配的元素的集合 node方法: appendChild(child) Node 给指定结点添加一个新的子结点 removeChild(child) Node 移除指定结点的子结点 replaceChild(newChild,oldChild) Node 替换指定结点的子结点 insertBefore(newChild,refChild) Node 在同一层级的结点前面插入新结点 hasChildNodes() Boolean 如果结点有子结点则返回true node属性: nodeName String 以字符串的格式存放结点的名称 nodeType String 以整型数据格式存放结点的类型 nodeValue String 以可用的格式存放结点的值 parentNode Node 指向结点的父结点的引用 childNodes NodeList 指向子结点的引用的集合 firstChild Node 指向子结点结合中的第一个子结点的引用 lastChild Node 指向子结点结合中的最后一个子结点的引用 previousSibling Node 指向前一个兄弟节点;如果这个节点就是兄弟节点,那么该值为null nextSibling Node 指向后一个兄弟节点;如果这个节点就是兄弟节点,那么该值为null
3.网上搜藏的一个map对象:
- function HashMap()
- {
- /** Map 大小 **/
- var size = 0;
- /** 对象 **/
- var entry = new Object();
- /** 存 **/
- this.put = function (key , value)
- {
- if(!this.containsKey(key))
- {
- size ++ ;
- }
- entry[key] = value;
- }
- /** 取 **/
- this.get = function (key)
- {
- return this.containsKey(key) ? entry[key] : null;
- }
- /** 删除 **/
- this.remove = function ( key )
- {
- if( this.containsKey(key) && ( delete entry[key] ) )
- {
- size --;
- }
- }
- /** 是否包含 Key **/
- this.containsKey = function ( key )
- {
- return (key in entry);
- }
- /** 是否包含 Value **/
- this.containsValue = function ( value )
- {
- for(var prop in entry)
- {
- if(entry[prop] == value)
- {
- return true;
- }
- }
- return false;
- }
- /** 所有 Value **/
- this.values = function ()
- {
- var values = new Array();
- for(var prop in entry)
- {
- values.push(entry[prop]);
- }
- return values;
- }
- /** 所有 Key **/
- this.keys = function ()
- {
- var keys = new Array();
- for(var prop in entry)
- {
- keys.push(prop);
- }
- return keys;
- }
- /** Map Size **/
- this.size = function ()
- {
- return size;
- }
- /* 清空 */
- this.clear = function ()
- {
- size = 0;
- entry = new Object();
- }
- }
- var map = new HashMap();
- /*
- map.put("A","1");
- map.put("B","2");
- map.put("A","5");
- map.put("C","3");
- map.put("A","4");
- */
- /*
- alert(map.containsKey("XX"));
- alert(map.size());
- alert(map.get("A"));
- alert(map.get("XX"));
- map.remove("A");
- alert(map.size());
- alert(map.get("A"));
- */
- /** 同时也可以把对象作为 Key **/
- /*
- var arrayKey = new Array("1","2","3","4");
- var arrayValue = new Array("A","B","C","D");
- map.put(arrayKey,arrayValue);
- var value = map.get(arrayKey);
- for(var i = 0 ; i < value.length ; i++)
- {
- //alert(value[i]);
- }
- */
- /** 把对象做为Key时 ,自动调用了该对象的 toString() 方法 其实最终还是以String对象为Key**/
- /** 如果是自定义对象 那自己得重写 toString() 方法 否则 . 就是下面的结果 **/
- function MyObject(name)
- {
- this.name = name;
- }
- /**
- function MyObject(name)
- {
- this.name = name;
- this.toString = function ()
- {
- return this.name;
- }
- }
- **/
- var object1 = new MyObject("小张");
- var object2 = new MyObject("小名");
- map.put(object1,"小张");
- map.put(object2,"小名");
- alert(map.get(object1));
- alert(map.get(object2));
- map.remove("xxxxx");
- alert(map.size());
- /** 运行结果 小名 小名 size = 1 **/
- /** 如果改成复写toString()方法的对象 , 效果就完全不一样了 **/
- </script>
function HashMap() { /** Map 大小 **/ var size = 0; /** 对象 **/ var entry = new Object(); /** 存 **/ this.put = function (key , value) { if(!this.containsKey(key)) { size ++ ; } entry[key] = value; } /** 取 **/ this.get = function (key) { return this.containsKey(key) ? entry[key] : null; } /** 删除 **/ this.remove = function ( key ) { if( this.containsKey(key) && ( delete entry[key] ) ) { size --; } } /** 是否包含 Key **/ this.containsKey = function ( key ) { return (key in entry); } /** 是否包含 Value **/ this.containsValue = function ( value ) { for(var prop in entry) { if(entry[prop] == value) { return true; } } return false; } /** 所有 Value **/ this.values = function () { var values = new Array(); for(var prop in entry) { values.push(entry[prop]); } return values; } /** 所有 Key **/ this.keys = function () { var keys = new Array(); for(var prop in entry) { keys.push(prop); } return keys; } /** Map Size **/ this.size = function () { return size; } /* 清空 */ this.clear = function () { size = 0; entry = new Object(); } } var map = new HashMap(); /* map.put("A","1"); map.put("B","2"); map.put("A","5"); map.put("C","3"); map.put("A","4"); */ /* alert(map.containsKey("XX")); alert(map.size()); alert(map.get("A")); alert(map.get("XX")); map.remove("A"); alert(map.size()); alert(map.get("A")); */ /** 同时也可以把对象作为 Key **/ /* var arrayKey = new Array("1","2","3","4"); var arrayValue = new Array("A","B","C","D"); map.put(arrayKey,arrayValue); var value = map.get(arrayKey); for(var i = 0 ; i < value.length ; i++) { //alert(value[i]); } */ /** 把对象做为Key时 ,自动调用了该对象的 toString() 方法 其实最终还是以String对象为Key**/ /** 如果是自定义对象 那自己得重写 toString() 方法 否则 . 就是下面的结果 **/ function MyObject(name) { this.name = name; } /** function MyObject(name) { this.name = name; this.toString = function () { return this.name; } } **/ var object1 = new MyObject("小张"); var object2 = new MyObject("小名"); map.put(object1,"小张"); map.put(object2,"小名"); alert(map.get(object1)); alert(map.get(object2)); map.remove("xxxxx"); alert(map.size()); /** 运行结果 小名 小名 size = 1 **/ /** 如果改成复写toString()方法的对象 , 效果就完全不一样了 **/ </script>
4.常用的数字函数:
- ·数字型(Number)
- 1.声明
- var i = 1;
- var i = new Number(1);
- 2.字符串与数字间的转换
- var i = 1;
- var str = i.toString(); //结果: "1"
- var str = new String(i); //结果: "1"
- i = parseInt(str); //结果: 1
- i = parseFloat(str); //结果: 1.0
- //注意: parseInt,parseFloat会把一个类似于"32G"的字符串,强制转换成32
- 3.判断是否为有效的数字
- var i = 123; var str = "string";
- if( typeof i == "number" ){ } //true
- //某些方法(如:parseInt,parseFloat)会返回一个特殊的值NaN(Not a Number)
- //请注意第2点中的[注意],此方法不完全适合判断一个字符串是否是数字型!!
- i = parseInt(str);
- if( isNaN(i) ){ }
- 4.数字型比较
- //此知识与[字符串比较]相同
- 5.小数转整数
- var f = 1.5;
- var i = Math.round(f); //结果:2 (四舍五入)
- var i = Math.ceil(f); //结果:2 (返回大于f的最小整数)
- var i = Math.floor(f); //结果:1 (返回小于f的最大整数)
- 6.格式化显示数字
- var i = 3.14159;
- //格式化为两位小数的浮点数
- var str = i.toFixed(2); //结果: "3.14"
- //格式化为五位数字的浮点数(从左到右五位数字,不够补零)
- var str = i.toPrecision(5); //结果: "3.1415"
- 7.X进制数字的转换
- //不是很懂 -.-
- var i = parseInt("0x1f",16);
- var i = parseInt(i,10);
- var i = parseInt("11010011",2);
- 8.随机数
- //返回0-1之间的任意小数
- var rnd = Math.random();
- //返回0-n之间的任意整数(不包括n)
- var rnd = Math.floor(Math.random() * n)
·数字型(Number) 1.声明 var i = 1; var i = new Number(1); 2.字符串与数字间的转换 var i = 1; var str = i.toString(); //结果: "1" var str = new String(i); //结果: "1" i = parseInt(str); //结果: 1 i = parseFloat(str); //结果: 1.0 //注意: parseInt,parseFloat会把一个类似于"32G"的字符串,强制转换成32 3.判断是否为有效的数字 var i = 123; var str = "string"; if( typeof i == "number" ){ } //true //某些方法(如:parseInt,parseFloat)会返回一个特殊的值NaN(Not a Number) //请注意第2点中的[注意],此方法不完全适合判断一个字符串是否是数字型!! i = parseInt(str); if( isNaN(i) ){ } 4.数字型比较 //此知识与[字符串比较]相同 5.小数转整数 var f = 1.5; var i = Math.round(f); //结果:2 (四舍五入) var i = Math.ceil(f); //结果:2 (返回大于f的最小整数) var i = Math.floor(f); //结果:1 (返回小于f的最大整数) 6.格式化显示数字 var i = 3.14159; //格式化为两位小数的浮点数 var str = i.toFixed(2); //结果: "3.14" //格式化为五位数字的浮点数(从左到右五位数字,不够补零) var str = i.toPrecision(5); //结果: "3.1415" 7.X进制数字的转换 //不是很懂 -.- var i = parseInt("0x1f",16); var i = parseInt(i,10); var i = parseInt("11010011",2); 8.随机数 //返回0-1之间的任意小数 var rnd = Math.random(); //返回0-n之间的任意整数(不包括n) var rnd = Math.floor(Math.random() * n)
5.网上搜藏的js堆栈:
- function stack(){
- if(this.top==undefined){
- //初始化堆栈的顶部指针和数据存放域
- this.top=0;
- this.unit=new Array();
- }
- this.push=function(pushvalue){
- //定义压入堆栈的方法
- this.unit[this.top]=pushvalue;
- this.top+=1;
- }
- this.readAllElements=function(){
- //定义读取所有数据的方法
- if(this.top==0){
- alert("当前栈空,无法读取数据");
- return("");
- }
- var count=0;
- var outStr="";
- for(count=0;count<this.top;count++){
- outStr+=this.unit[count]+",";
- }
- return(outStr);
- }
- this.pop=function(){
- //定义弹出堆栈的方法
- if(this.top==0){
- alert("当前栈空,无法弹出数据");
- return("");
- }
- var popTo=this.unit[this.top-1];
- this.top--;
- return(popTo);
- /* 从堆栈弹出数据,顶部指针减一,不过这里没有做到资源的释放,也
- 就是说数据仍然存在于this.unit的数组中,只不过无法访问罢了。目前
- 我也没想到好的办法解决。*/
- }
- }
function stack(){ if(this.top==undefined){ //初始化堆栈的顶部指针和数据存放域 this.top=0; this.unit=new Array(); } this.push=function(pushvalue){ //定义压入堆栈的方法 this.unit[this.top]=pushvalue; this.top+=1; } this.readAllElements=function(){ //定义读取所有数据的方法 if(this.top==0){ alert("当前栈空,无法读取数据"); return(""); } var count=0; var utStr=""; for(count=0;count<this.top;count++){ outStr+=this.unit[count]+","; } return(outStr); } this.pop=function(){ //定义弹出堆栈的方法 if(this.top==0){ alert("当前栈空,无法弹出数据"); return(""); } var popTo=this.unit[this.top-1]; this.top--; return(popTo); /* 从堆栈弹出数据,顶部指针减一,不过这里没有做到资源的释放,也 就是说数据仍然存在于this.unit的数组中,只不过无法访问罢了。目前 我也没想到好的办法解决。*/ } }
6.最常用的JavaScript日期函数:
- ·日期型(Date)
- 1.声明
- var myDate = new Date(); //系统当前时间
- var myDate = new Date(yyyy, mm, dd, hh, mm, ss);
- var myDate = new Date(yyyy, mm, dd);
- var myDate = new Date("monthName dd, yyyy hh:mm:ss");
- var myDate = new Date("monthName dd, yyyy");
- var myDate = new Date(epochMilliseconds);
- 2.获取时间的某部份
- var myDate = new Date();
- myDate.getYear(); //获取当前年份(2位)
- myDate.getFullYear(); //获取完整的年份(4位,1970-????)
- myDate.getMonth(); //获取当前月份(0-11,0代表1月)
- myDate.getDate(); //获取当前日(1-31)
- myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
- myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数) 时间戳!!
- myDate.getHours(); //获取当前小时数(0-23)
- myDate.getMinutes(); //获取当前分钟数(0-59)
- myDate.getSeconds(); //获取当前秒数(0-59)
- myDate.getMilliseconds(); //获取当前毫秒数(0-999)
- myDate.toLocaleDateString(); //获取当前日期
- myDate.toLocaleTimeString(); //获取当前时间
- myDate.toLocaleString( ); //获取日期与时间
- 3.计算之前或未来的时间
- var myDate = new Date();
- myDate.setDate(myDate.getDate() + 10); //当前时间加10天
- //类似的方法都基本相同,以set开头,具体参考第2点
- 4.计算两个日期的偏移量
- var i = daysBetween(beginDate,endDate); //返回天数
- var i = beginDate.getTimezoneOffset(endDate); //返回分钟数
- 5.检查有效日期
- //checkDate() 只允许"mm-dd-yyyy"或"mm/dd/yyyy"两种格式的日期
- if( checkDate("2006-01-01") ){ }
- //正则表达式(自己写的检查 yyyy-mm-dd, yy-mm-dd, yyyy/mm/dd, yy/mm/dd 四种)
- var r = /^(\d{2}|\d{4})[\/-]\d{1,2}[\/-]\d{1,2}$/;
- if( r.test( myString ) ){ }
·日期型(Date) 1.声明 var myDate = new Date(); //系统当前时间 var myDate = new Date(yyyy, mm, dd, hh, mm, ss); var myDate = new Date(yyyy, mm, dd); var myDate = new Date("monthName dd, yyyy hh:mm:ss"); var myDate = new Date("monthName dd, yyyy"); var myDate = new Date(epochMill
-
js 年月日时间处理
2011-12-07 14:39:15
var myDate = new Date();
myDate.getYear(); //获取当前年份(2位)
myDate.getFullYear(); //获取完整的年份(4位,1970-到今)
myDate.getMonth(); //获取当前月份(0-11,0代表1月)
myDate.getDate(); //获取当前日(1-31)
myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)
myDate.getHours(); //获取当前小时数(0-23)
myDate.getMinutes(); //获取当前分钟数(0-59)
myDate.getSeconds(); //获取当前秒数(0-59)
myDate.getMilliseconds(); //获取当前毫秒数(0-999)
myDate.toLocaleDateString(); //获取当前日期
var mytime=myDate.toLocaleTimeString(); //获取当前时间
myDate.toLocaleString( ); //获取日期与时间获取年,月,日,小时,分钟,秒,等方法总结
-
招聘软件测试高中低人员
2011-12-07 09:56:16
高级测试工程师--性能和自动化测试方向
【职能】
1.负责项目组产品自动化测试平台建设及维护
2.执行自动化测试,并分析执行结果,提交产品缺陷
3.对分布式服务器进行性能测试,并辅助分析和调优
4.编写各种类型的性能测试方案,如接口,数据库,应用产品的性能测试
【任职要求】
1.熟悉Unix、Linux操作系统环境和命令
2.有两年以上性能及自动化测试经验,具备建立自动化测试框架和性能瓶颈分析、调优能力
3.精通自动化、性能测试。熟练使用如LoadRunner、QTP、Selenium等工具,(并非简单录制回放,需要设计自动化测试框架;需要对性能测试有着深入的理解及分析能力)
4.至少熟练掌握Shell、Perl、Python中的一种
5.能独立搭建包含监控程序的测试环境,熟练使用JProfiler等相关辅助测试工具
高级测试工程师--LinuxC测试开发方向
【职能】
1.在Linux环境下进行测试工具的开发
2.对系统进行白盒测试
【任职要求】
1.熟悉Unixnux posix api使用,掌握socket多线程编程。精通C/C++语言
2.熟悉Linux C/C++开发环境,熟练掌握gcc, gdb
3.熟练掌握网络编程的基本模型和方法,有实际项目的开发经验,会进行网络协议设计者优先
4.理解CGI/perl,PHP, JSP等前端服务系统与后端c/c++处理服务器衔接方式,有相应系统设计经验者优先
高级测试工程师--服务器测试方向
【职能】
1.负责搭建复杂测试环境,完成系统安装部署,并独立解决部署中的问题,完成系统调优
2.编写测试脚本完成测试任务、提高总体效率
3.对分布式服务器进行性能和高可用测试
【任职要求】
1.精通Linux命令和系统管理
2.至少熟练掌握Shell、Perl、Python中的两种
3.有在Linux下部署配置各种基础应用,并对其进行配置的实际项目经验。(如http、ftp、database、中间件、samba、heartbeat等)
4.熟练掌握sed、awk用法
5.对服务器负载、压力、可靠性、集群有一定部署和测试经验
下面是高级测试工程师岗位JD
通用
【职能】
1.主导软件产品的测试需求分析,负责测试计划和测试方案的制定。预先评估项目的风险并能提出有效规避方案
2.评审架构和产品设计,给出反馈意见
3.设计功能、性能、高可用性等测试用例,执行测试并分析系统问题和瓶颈
4.针对bug报告,分析、定位bug,为开发人员提供bugfix的重要信息
5.培养其他测试工程师
【任职要求】
0.计算机本科及以上学历,4年以上测试工作经验,有开发经验者至少2年以上测试经验
1.具备基础网络知识,了解基本路由、交换、应用协议的原理
2.掌握数据库原理,和常用数据库的使用。能根据要求编写SQL语句
3.对软件测试有浓厚的兴趣和丰富的经验,有极强的质量意识,有分析和定位问题的能力
4.有很高的团队合作意识,具备一定抗压能力和快速学习能力。
5.了解项目研发测试流程和软件开发规范,掌握常用项目管理、缺陷管理工具的使用
6.有独力编写测试计划、方案经验
7.具有大型分布式软件系统的测试经验技术者优先
8.熟悉PHP、Java并具备开发经验者优先
9.在音视频领域有测试经验者优先联系方式:QQ : 286264301
-
siege-2.70 web 测试小工具
2011-11-29 15:47:25
1、siege-2.70 下载地址:http://www.joedog.org/pub/siege/
安装: ./configure
make && make install
使用方法: siege ./siege -c 500 -r 150 -f sites.list -i -b -c 500
并发500个用户
-r 150 重复循环150次
-f sites.list 任务的URL列表
其它实用参数:
-i 随机 URL ,默认是从列表的上面到下面来打压力
-b 进行压力测试,不进行延时
-
Netperf是一种网络性能的测量工具
2011-11-29 15:24:45
Netperf概况 Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。
Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。
安装
unbunt
1、apt-get install netperf
or
1、./configure
2、make && make install
使用
netperf -H ip -P 12865 -l 60 -f file.txt
参数说明:
1、—H 加主机名称
2、-P 设置断口:但是默认是 12865 ,本端口好像不可以修改的
3、-f 增加文件: 可以通过文件的拷贝方式来测试网络流量
4、-l 设置测试时间,默认是10秒左右
本工具作用:
可以测试网络的带宽,网络的流量,还是比较真实的,原理很简单,通过socket 协议,部属一个服务器(就是被测试机),再部属一个客户端,发送请求到服务器,以此来查看网络的带宽。
-
loadrunner在线技术指导
2011-11-15 12:26:47
http://item.taobao.com/item.htm?id=14296360165
服务内容如下:
1、loadrunner在线技术指导和服务
2、自动化在线技术指标和服务
QQ :286264301
email : test_fang@163.com
-
Loadrunner 遍历一个页面中的URL并访问之
2011-11-14 18:11:56
Loadrunner 遍历一个页面中的URL并访问之:
好久没有写这方面的代码了,今天写了一个遍历每一个页面中的所有URL,并打开URL地址。对无效的URL进行了排除操作。
Action()
{
char temp[64];
int num = 0 ;
int i = 0 ;
char *str ;
// char *temp ;//获取函数,是一个数组
web_reg_save_param(
"UrlList",
"LB/ALNUMIC=<a href=\"",
"RB=\"",
"ORD=all",
LAST);
web_url("localhost",
"URL=http://www.baidu.com",
LAST);//获取数据的长度
str = lr_eval_string("{UrlList_count}");
lr_error_message("%s",str);num = atoi(str);
for(i=1;i<=num;i++){
//格式化输出
sprintf(temp,"{UrlList_%d}",i);
//生成参数
lr_save_string(lr_eval_string(temp),"Turl");//判定URL 是否合法
if (strstr(lr_eval_string(temp),"http")) {
web_url("TESTER","URL={Turl}", LAST);
}else
{
lr_error_message("Url is not exits");
}
}
return 0;
} -
程序员-自嘲歌
2011-11-14 15:18:01
写字楼里写字间,写字间中程序员;
程序人员写程序,又将程序换酒钱;
酒醒只在屏前坐,酒醉还来屏下眠;
酒醉酒醒日复日,屏前屏下年复年;
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员;
别人笑我太疯癫,我笑自己命太贱;
但见满街漂亮妹,哪个归得程序员
-
loadrunner 测试web service
2011-09-27 15:40:57
以前看到谁多的朋友都遇到测试web service 遇到很多的问题,最先是不知道怎么测试的,如果来录制脚本可能是最大的问题,第二个问题就是如何参数化。本人今天有时间就写一点解决上面的两个问题
背景:本人采用WSDL公开的地址来进行测试获取其中一个国家一个城市的天气情况的接口。
操作步骤如下:
step1、打开URL
URL: http://www.webservicex.net/globalweather.asmx?WSDL
step2、保存本网页的内容到本地硬盘
保存文件的名字为: globalweather.asmx
step3 打开loadrunner
1、选择协议: web service
2、点击 add service call
3、点击 service :import service
4、弹出一个对话框,你选择file ->本地已经保存的文件 globalweather.asmx
5、点击 import ,会提示导入成功
6、点击 operation 可以看到要测试的函数
step4: 、参数化
1 、打开 add service call
2、选择要测试的函数 GetWeather
3、选择要参数化的参数:
"CityName=abcde",
"CountryName=abcde",//返回结果的定义
"GetWeatherResult=Param_GetWeatherResult",
4、点击 确认
step5: 结束
通过上面几部操作后,就会在action() 里面生成代码。如下:
web_service_call( "StepName=GetWeather_102",
"SOAPMethod=GlobalWeather|GlobalWeatherSoap|GetWeather",
"ResponseParam=response",
"Service=GlobalWeather",
"ExpectedResponse=SoapResult",
"Snapshot=t1317110209.inf",
BEGIN_ARGUMENTS,
"CityName=abcde",
"CountryName=abcde",
END_ARGUMENTS,
BEGIN_RESULT,
"GetWeatherResult=Param_GetWeatherResult",
END_RESULT,
LAST); -
PHP测试https API接口的方法
2011-09-27 15:29:35
以前也没有接触过通过https来测试API接口的方法,今天工作中用到了,也实现了。总结一下:大致分以下几个部分:
1、增加 证书:利用PHP将证书加载到脚本中如下:
//加载证书的函数
function sslInit($ch){
//证书-start
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_CAINFO, './cert/ca_cert.pem');//根证书
curl_setopt($ch, CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch, CURLOPT_SSLCERT, './cert/client_cert.pem');//公钥
curl_setopt($ch, CURLOPT_SSLKEYTYPE,'PEM');//私钥文件格式
curl_setopt($ch, CURLOPT_SSLKEY,'./cert/client_key.pem');//私钥
curl_setopt($ch, CURLOPT_SSLKEYPASSWD,'111111');//私钥的密码
//证书-end
curl_setopt($ch, CURLOPT_COOKIEJAR,'./logs/cookie.txt'); //保存
curl_setopt($ch, CURLOPT_COOKIEFILE,'./logs/cookie.txt');//读取
return $ch ;
}2、实现登录 通过加载证书来验证用户的合法性及签名是否正确
function login(){
//fengbo.xue@quanshi.com q111111
$xml_data = '<?xml version="1.0" encoding="utf-8"?>';
$xml_data .= '<request>';
$xml_data .= '<username>XXXXXX@XX.COM</username>';
$xml_data .= '<password>tester</password>';
$xml_data .= '</request>';
$url = 'https://XXX.XX.XX/login';
$header[] = "Content-type: text/xml";//定义content-type为xml
$ch = curl_init();
$ch = $this->sslInit($ch);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
$response = curl_exec($ch);
//echo $response;
return $response ;
if(curl_errno($ch)) {
print_r(curl_error($ch));
}
curl_close($ch);
}3、加载要测试的API
如:
function join($LshyID)
{$xml_data = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<userDTO>
<clientType>2</clientType>
<userStatus>1</userStatus>
</userDTO>';
$url = 'https://xxx.xxx.xxx/join/SME-MEETING/'.$LshyID;
$header[] = "Content-type: application/xml";//定义content-type为xml$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);//证书-start
$ch=$this->sslInit($ch);$response = curl_exec($ch);
return $response;
if(curl_errno($ch)) {
print_r(curl_error($ch));
}
curl_close($ch);
}总结:又是一个三步曲。。。哈哈。。 自己发现写代码还挺好玩的。以前还真想走开发的路。
希望对正迷茫的朋友,正在查找这方面的测试资源的朋友一点指导。哈哈。。。
-
loadrunner 测试https
2011-09-26 18:26:02
开始的时候也不知道loadrunner支持https协议,通过网上查找还真是支持,很牛B的软件啊。。。
测试实现的方法如下:
1.增加如下的函数
/*增加安全证书*/
web_set_certificate_ex(
"CertFilePath=client_cert.pem", //个人公钥
"CertFormat=PEM",
"KeyFilePath=client_key.pem", //个人私钥
"KeyFormat=PEM",
"Password=111111",
LAST );
2. 用户登录
web_custom_request("Login",
"URL=https://api.xxxx.com/restful/login",
"Method=POST",
"Resource=0",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
"EncType=text/plain; charset=UTF-8",
"Body=<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n""\t\t<request>"
"<username>XXXXXXXX@163.com</username><password>XXXXX</password></request>\n",
LAST);
3.增加你要测试的方法
结果:搞定。。。 三步曲。。。
-
php soapclient 访问 java soapserver
2011-09-09 13:31:50
php soapclient 访问 java soapserver 开始的时候,自己还在捉摸了很长的时间,其实这个也不难的。
操作方法:
1. new SoapClient()
2. 调用方法getweather () ,注意参数的个数和内容要正确
3. 调用返回结果: out->GetCitiesByCountryResult;
总结自己在网好找了很多的例子,许多都是PHP调用自己 php soapserver
唉,知识总是用的时候,方知自己的无知。
//举例代码如下:
<?php
//$client = new SoapClient('http://www.webservicex.net/globalweather.asmx?WSDL');
$client = new SoapClient(http://www.webservicex.net/globalweather.asmx?WSDL);
//获取一个国家的城市列表
$param=array("CountryName"=>'China');
$out=$client->GetCitiesByCountry($param);
$data=$out->GetCitiesByCountryResult;
print_r($data);
//获取一个国家的城市列表的天气预报
$param=array("CityName"=>'Beijing',"CountryName"=>'China');
$out1 = $client->GetWeather($param);
$data1 = $out1->GetWeatherResult;
//print_r($data1);?>
-
mysql 锁表与解锁
2011-08-23 14:50:53
mysql 锁表与解锁
2008-10-09 12:46:53| 分类: MYSQL | 标签: |字号大中小 订阅
mysql> use t_girl
Database changed
mysql> show open tables;
+----------+---------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+---------------+--------+-------------+
| t_girl | slave | 0 | 0 |
| mysql | help_keyword | 0 | 0 |
| mysql | help_category | 0 | 0 |
| mysql | help_relation | 0 | 0 |
| t_girl | t1 | 0 | 0 |
| mysql | help_topic | 0 | 0 |
| mysql | user | 0 | 0 |
+----------+---------------+--------+-------------+
7 rows in set (0.00 sec)
mysql> lock tables t1 as a read;
Query OK, 0 rows affected (0.00 sec)
mysql> show open tables;
+----------+---------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+---------------+--------+-------------+
| t_girl | slave | 0 | 0 |
| mysql | help_keyword | 0 | 0 |
| mysql | help_category | 0 | 0 |
| mysql | help_relation | 0 | 0 |
| t_girl | t1 | 1 | 0 |
| mysql | help_topic | 0 | 0 |
| mysql | user | 0 | 0 |
+----------+---------------+--------+-------------+
7 rows in set (0.00 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> show open tables;
+----------+---------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+---------------+--------+-------------+
| t_girl | slave | 0 | 0 |
| mysql | help_keyword | 0 | 0 |
| mysql | help_category | 0 | 0 |
| mysql | help_relation | 0 | 0 |
| t_girl | t1 | 0 | 0 |
| mysql | help_topic | 0 | 0 |
| mysql | user | 0 | 0 |
+----------+---------------+--------+-------------+
7 rows in set (0.00 sec) -
PHP 正则表达式
2011-07-28 18:22:15
//【CMS-HLD_0.001】userJoin
$cont=$cmsapi->userJoin_001($YyhyID,$pinCode);
echo "-------返回的数据----</br>";
echo $cont.'</br>';
preg_match('/tempconfernceid\":"([0-9])+"/',$cont,$arrlshyid); //匹配数据
preg_match('/tempuserid":"([0-9])+"/',$cont,$arrlsuserid);
print_r($arrlshyid);
print_r($arrlsuserid);
$LshyID=substr($arrlshyid['0'],18,9); //返回 的ID,
$LsuserID=substr($arrlsuserid['0'],13,9); //返回 ID,//备注:preg_match 匹配相关的信息; substr 截取想要的字符串.
-
PHP 监控memcache
2011-07-28 18:17:33
PHP 学习监控memcache 的代码(刚刚学习PHP,感觉功能挺强大的)
下面的代码是监控了memcache几个参数 ,通过入数据库,然后再次展示在页面中的代码.具体的代码如下所示:
<html>
<title>Memcache montior ...</title>
<h1>Memcache Monitor perform. data!</br></h1><?php
//memcache t����
include 'cmysql.php';
$memcache = new Memcache();
$memcache->connect("10.1.71.102","11211");
$arrConn=$memcache->getstats();
$curr_connections = $arrConn["curr_connections"];
$total_connections = $arrConn["total_connections"];
$get_hits = $arrConn["get_hits"];
$get_misses = $arrConn["get_misses"];
$cmd_get = $arrConn["cmd_get"];
$cmd_set = $arrConn["cmd_set"];
$memcache->close();//��ݿ�,ȡ��������
$mnow = time();$sql = "insert into memcache(curr_connections,total_connections,get_hits,get_misses,cmd_get,cmd_set,mdate)values($curr_connections,$total_connections,$get_hits,$get_misses,$cmd_get,$cmd_set,$mnow)";
$mysql = new Mysql();
$mysql->mysql_conn();
$mysql->mysql_insert($sql);
$mysql->mysql_close();
//����ݿ�ȡ��ݣ�Ȼ��չʾ��4
$select_sql = "select * from memcache order by mdate limit 10";
$mysql = new Mysql();
$mysql->mysql_conn();
$arrData = $mysql->mysql_select($select_sql);echo "<table border=\"20\" color=red>";
echo "<tr>";
echo "<td>curr_connections</td>";
echo "<td>total_connections</td>";
echo "<td>cmd_get</td>";
echo "<td>cmd_set</td>";
echo "<td>get_hits</td>";
echo "<td>get_misses</td>";
echo "<td>delete_hits</td>";
echo "<td>threads</td>";
echo "</font>";
foreach ( $arrData as $k => $v ) {
echo"<tr>
<td>{$v['curr_connections']}</td>
<td>{$v['total_connections']}</td>
<td>{$v['cmd_get']}</td>
<td>{$v['cmd_set']}</td>
<td>{$v['get_hits']}</td>
<td>{$v['get_misses']}</td>
<td>{$v['delete_hits']}</td>
<td>{$v['threads']}</td>
</tr>";
}
echo"<table>";$mysql->mysql_close();
?>
</html>
我的栏目
标题搜索
我的存档
数据统计
- 访问量: 327395
- 日志数: 197
- 图片数: 1
- 文件数: 3
- 书签数: 3
- 建立时间: 2007-07-30
- 更新时间: 2016-08-26