事务时间如何去掉wasted time

  事务时间

一个事务的时间是指持续时间,事务会完全记录下从事务开始到事务结束之间的时间差,那么事务的时间能真实地反映业务操作的时间吗?不能,就好像人用手按秒表来记录短跑时间一样,得出的时间并不是完全准确,存在观察的误差和操作的误差,对于一个事务时间来说,一般由四部分组成,如图3.166所示。

 
图3.166  事务时间组成

响应时间

这是事务的目的,通过事务记录业务操作所消耗的响应时间。

事务自身时间

事务中哪怕没有操作,也是需要时间的,不过这个时间一般在0.01秒左右,所以可以忽略。

  1. lr_start_transaction("thinktime");
  2. lr_end_transaction("thinktime", LR_AUTO);

运行上面的脚本后,可以看到:

  1. Action.c(5): Notify: Transaction "thinktime" started.
  2. Action.c(9): Notify: Transaction "thinktime" ended with "Pass" status (Duration: 0.0121).

思考时间(Think Time)

Think Time是LoadRunner提供的一种模拟用户等待的方式,通过lr_think_time()函数实现。在函数内写入对应的时间(单位是秒),当脚本在Controller中运行到该函数时就会等待相应的时间。注意在VuGen中,回放Think Time默认关闭。

Think Time在进行性能测试的时候需要打开,只有这样每个虚拟用户才是真正按照用户的操作速度来完成请求,才能得到在真实情况下的系统数据。如果不打开Think Time,测试获得的数据是在全负载下的一些理论峰值数据。

那么Think Time 在事务中如何影响事务时间呢?编写如下脚本:

  1. lr_start_transaction("thinktime");
  2. lr_think_time(5);
  3. lr_end_transaction("thinktime", LR_AUTO);

在Run-time Settings中设置Think Time,启用Replay Think Time功能,运行之后可以看到以下结果:

  1. Action.c(5): Notify: Transaction "thinktime" started.
  2. Action.c(7): lr_think_time: 5.00 seconds.
  3. Action.c(9): Notify: Transaction "thinktime" ended with "Pass" status (Duration: 5.0254 Think Time: 4.9995).

所以Think Time 会被算在事务的时间内,不过在Analysis中可以设置过滤规则将其扣除,另外我们也建议尽量不要在事务内使用lr_think_time()函数。

浪费时间(Wasted Time)

在使用事务的时候,经常会看到在事务日志中有Wasted Time。Wasted Time是指事务中应该扣除的由于其他原因导致的时间浪费。在默认情况下LoadRunner会将自身脚本运行浪费的时间自动记入Wasted Time。例如执行关联、检查点等函数的时间。

除了脚本自身浪费的时间,某些时候使用C语言等外部接口进行处理所消耗的时间也会影响事务的时间,而这个时间LoadRunner无法处理,在这种情况下就需要人为地计算第三方时间开销,并且将这个开销的时间记入Wasted Time中。

运行一下下面的代码:

  1. Action()
  2. {
  3. int i;
  4. int baseIter = 100;
  5. char dude[1000];
  6. merc_timer_handle_t timer;
  7. // Examine the total elapsed time of the action
  8. //Start transaction
  9. lr_start_transaction("Demo");
  10. timer=lr_start_timer();
  11. for (i=0;i<=baseIter*1000;i++) {
  12. sprintf(dude,"This is the way we waste time in a script = %d", i);
  13. }
  14. wasteTime=lr_end_timer(timer);
  15. lr_wasted_time(wasteTime*1000);
  16. lr_end_transaction("Demo", LR_AUTO);
  17. return 0;
  18. }

其中,lr_start_timer()是一个LoadRunner自带的时间计数器,它和lr_end_timer()相对应,能够返回这两个函数间的时间差。

运行脚本后,等待一段时间脚本运行结束,可以看到以下日志。

  1. Action.c(18): Notify: Transaction "Demo" started.
  2. Action.c(27): wasted time is 85.860000
  3. Action.c(28): Notify: Transaction "Demo" ended with  "Pass" status (Duration: 85.8772 Wasted Time: 85.8600).

通过上面这个日志可以看到,在VuGen运行脚本的时候这个1000次的C语言操作所消耗的时间会被算在Transaction时间内,导致Transaction的时间变长。当通过lr_start_timer()计时函数将这个消耗时间加入Wasted Time后,这个脚本就能正确地计算出事务的时间和该事务时间的Wasted Time了。当在场景中运行的时候,事务的响应时间会自动扣除Wasted Time。

为了确保响应时间的正确,需要扣除在运行脚本时自身的时间消耗,事务中尽量避免出现非请求的处理内容,如果无法避免请使用lr_wasted_time()函数将多余的时间开销扣除。

例如这样的脚本:

  1. merc_timer_handle_t timer; //变量声明
  2. lr_start_transaction("Demo");
  3. timer=lr_start_timer();
  4. lr_load_dll("getkey.dll");
  5. lr_save_string(getrandkey(),"key");
  6. //通过调用dll获得密钥
  7. wasteTime=lr_end_timer(timer);
  8. lr_wasted_time(wasteTime*1000);
  9. lr_end_transaction("Demo", LR_AUTO);

计算密钥是很消耗时间的,那么可以使用timer这个变量来记录计算的时间,并将这个时间从整个事务中扣除。

在计算Wasted Time时不要直接使用lr_wasted_time()覆盖,而忘了加上脚本中LoadRunner函数的自身时间。通过lr_get_transaction_wasted_time()函数可以获得事务自身的Wasted Time,将这个时间累加上第三方统计的Wasted Time再通过lr_wasted_time()函数覆盖。

时间: 2024-12-26 08:37:10

事务时间如何去掉wasted time的相关文章

html中去掉文本框(input type=&quot;text&quot;)的边框或只显示下边框

去掉: <input   type="text"   name="textfield"   style="border:0px;">只留下边框: <input type="text" style="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: solid&

java decompiler如何去掉行号

今天想反编译jar包保存源代码,默认前面加了行号,不知道这个小工具如何设置去掉行号? 反编译后: 找到它的安装路径,我的是:C:\Program Files\decomp.然后将该路径加入到环境变量path中. 首先将要反编译的jar文件,用Winrar解压到和jar文件名称一样的文件夹中 在命令输入框中输入如下命令: jad -o -r -dF:\am -sjava F:\amclientsdk\**\*.class 其中:F:\am 表示编译后文件的存放路径 F:\amclientsdk\*

nginx去掉url中的index.php

使用情境:我想输入www.abc.com/a/1后,跳转到www.abc.com/index.php/a/1 配置Nginx.conf在你的虚拟主机下添加:  location / {      if (!-e $request_filename){           rewrite ^/(.*)$ /index.php/$1 last;      } } 如果你的项目入口文件在一个子目录内,则: location /目录/ {      if (!-e $request_filename){

python 按每行读取文件怎么去掉换行符

python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello world\n" >>> print a #可以看到hello world下面空了一格 hello world >>> a.split() #通过split方法将字符转换成列表 ['hello', 'world'] #从列表中取第一个字符 >>> a.

【CSS网页排版】如何去掉博客园侧栏上的“公告”

友情链接前面总有"公告"两个字看着很别扭,所以就上w3school学习了一下css怎么写,终于给去掉了 需要用到类选择器和子元素选择器 http://www.w3school.com.cn/css/css_selector_class.asp http://www.w3school.com.cn/css/css_selector_child.asp 模板html代码: <div class="newsItem"><h3 class="ca

SAP系统stms传输管理系统中去掉导入所有请求图标(小车)

文章为原创,转载请联系我,欢迎交流[email protected] 在SAP生产系统中,传输请求时"导入全部请求"是很危险的,所以一般去掉这个选项 用ddic用户登录系统 使用事务代码:stms进入传输管理系统,点击下图黄色框内的图标 加一个参数 点击保存. 再次查看,该图标已消失 文章为原创,转载请联系我,欢迎交流[email protected]

Java数组去掉反复的方法集

经经常使用到,有时候不仅仅是简单的基本类型,那种能够用set集合去重,好多时间用到的是我们自己定义的类型,以下举个样例(我这儿就那int举例了): 方法一. 这样的类似与选择排序算法,首先我们取i值,然后将i之后的全部反复的去掉.详细实现例如以下: import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * 创建时间:2014-11-18 下午3:26:35 * * @author zhangtia

discuz如何去掉论坛的网页后缀名称forum.php

如何去掉论坛域名后面烦人的forum.php 其实这个设置超级简单,请看下面操作在后台--全局--域名设置--默认处,填写你当前所用的域名. 别忘记了提交,再清除IE 缓存,就可以了.

Eclipse去掉对JS文件的Validation

Eclipse不去掉对JS文件的Validation,编译时会花费很长的时间,有时甚至会导致编译失败. 可以按照如下的方式去掉对JS文件的Validation. 一.window->preference->Java Script->Validator->Errors/Warnings->Enable JavaScript Sematic validation前面的勾去掉. 二.找到项目所对应的 .project 文件,在workspace项目对应的文件夹下,删除文件中的以下部