如何在delphi7中,测试一段代码的执行时间?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在delphi7中,测试一段代码的执行时间?相关的知识,希望对你有一定的参考价值。

procedure (........................)
var
time: Cardinal;
begin
time := GetTickCount;//begin的下一行
需要测试的代码。。。。。。。。。。。。。
time := GetTickCount - time;//end的上一行
end;
但是侧不出来值,要不是值是那种随机数,要不就是time没有值,能说下,具体用法?什么环境中才能测吗?

给你个最简单的方法
放一个 timer控件 一个edit edit默认内容0 然后双击timer控件 timer1.interval=1000; 1000毫秒执行一次 =1秒执行一次
procedure TForm1.Timer1Timer(Sender: TObject);
begin
edit1.Text:=inttostr(strtoint(edit1.Text)+1);
end;
默认timer1.enabled:=fales;
需要记时的时候timer1.enabled:=true;
需要停止的时候 timer1.enabled:=fales;
没有编译器 应该没问题
edti1里的内容就是运行时间啦 很简单的一个原理 有不会+QQ448912 希望给分
参考技术A 随机数?那不就是执行时间么?单位是毫秒。
代码没有问题,要不就GetTickCount精准度还不够,可以适当增加测试的代码,或者用CPU时间戳,这个精度更高。反正最终返回的time就是所花的时间
参考技术B BeginCount,Endcount,StartCount:Cardinal;
BeginCount:=GetTickCount;获取系统启动的时间 
//执行的代码
Endcount:=GetTickCount;
F('分词耗时' + IntToStr(Endcount - BeginCount) + '毫秒');

参考技术C 这个用法没有问题,可能是你的被测试代码修改了time的值了,gettickcount是可以测到毫秒的,应该能满足要求。如果你的待测代码时间太短,有可能测出来是0。 参考技术D 代码开始时读取当前tick值,gettickcount64,结束再取一次gettickcount64,相减就可以知道执行时间

如何延迟执行 Web 测试的第一个请求?

【中文标题】如何延迟执行 Web 测试的第一个请求?【英文标题】:How to delay execution of the first request of a web test? 【发布时间】:2015-09-14 10:36:08 【问题描述】:

在 Visual Studio 2013 Web 性能测试中,如何在我指定的一段时间内延迟发送“.webtest”中的第一个请求?我的网络测试是负载测试的一部分。 Web 测试的第一个请求应在数据源字段指定的延迟时间之后发出。确定何时发出请求很简单:

delayPeriod = dataSourceValue - ( timeNow - loadTestStartTime )

将此delayPeriod 写入请求的思考时间会导致正确的延迟。不幸的是,在收到对请求的响应之后应用思考时间。因此很容易将 web 测试的第二个请求延迟到所需的时间。我想延迟第一个请求之前。

作为一种解决方法,我在http://localhost/ 中包含了一个虚拟的第一个请求,并将预期的状态代码结果设置为 404。所需的延迟设置为该请求的思考时间。但这会向localhost 添加一个不需要的请求。

背景: 我们有一个来自 Web 服务器的日志文件。它给出了每个请求的 URL 和时间。我们希望以与记录请求时相同的速率重复该日志文件中的请求。

【问题讨论】:

【参考方案1】:

好的,再试一次。虽然是简单的,但没有错误检查。

LoadTestStartTime 负载测试插件将对负载测试本身和负载测试开始时间的引用放入 Web 测试上下文中。

public class LoadTestStartTime : ILoadTestPlugin

    public const string LoadTestContextParameterName = "$LoadTest";
    public const string LoadTestStartTimeContextParameterName = "$LoadTestStartTime";

    public void Initialize(LoadTest loadTest)
    
        DateTime startTime = default(DateTime);

        loadTest.LoadTestStarting += (sender, e) =>  startTime = DateTime.Now; ;

        loadTest.TestStarting += (sender,e) => 
            e.TestContextProperties[LoadTestContextParameterName] = loadTest;
            e.TestContextProperties[LoadTestStartTimeContextParameterName] = startTime;
        ;
    

DelayWebTest Web 测试插件必须附加到包含一个虚拟请求的新 Web 测试(不会执行虚拟请求)。这个新的 Web 测试必须作为“初始化测试”添加到负载测试场景测试组合中。

插件从上下文参数中读取延迟时间,然后将场景的当前负载设置为 0。然后它会设置一个计时器,该计时器在正确计算延迟后调用事件处理程序,从而恢复负载配置文件以允许测试继续进行.它使用锁定,因此只有第一个虚拟用户将执行加载配置文件逻辑,而其他用户则等待。

public class DelayWebTest : WebTestPlugin

    public string ContextParameterName  get; set; 

    private bool completed = false;
    private object _lock = new object();

    public override void PreRequest(object sender, PreRequestEventArgs e)
    
        e.Instruction = WebTestExecutionInstruction.Skip;
        if (!completed)
        
            lock (_lock)
            
                if (!completed)
                
                    if (e.WebTest.Context.WebTestUserId > 0) return;
                    LoadTest loadTest = (LoadTest)e.WebTest.Context[LoadTestStartTime.LoadTestContextParameterName];
                    DateTime startTime = (DateTime)e.WebTest.Context[LoadTestStartTime.LoadTestStartTimeContextParameterName];
                    TimeSpan delay = TimeSpan.Parse(e.WebTest.Context[ContextParameterName].ToString());
                    TimeSpan timer = delay - (DateTime.Now - startTime);
                    if (timer > default(TimeSpan))
                    
                        var loadProfile = loadTest.Scenarios[0].LoadProfile.Copy();
                        loadTest.Scenarios[0].CurrentLoad = 0;
                        Timer t = new Timer()  AutoReset = false, Enabled = true, Interval = timer.TotalMilliseconds ;
                        t.Elapsed += (_sender, _e) =>
                        
                            loadTest.Scenarios[0].LoadProfile = loadProfile;
                            t.Stop();
                        ;
                        t.Start();
                    
                    completed = true;
                
            
        
    

似乎有效。 50 个用户,延迟 30 秒:

【讨论】:

问题中的解决方法使我能够进行所需的测试,因此我不再需要花时间在这个主题上,但感谢您的想法。问题在于延迟单个网络测试,而不是延迟场景。 感谢e.Instruction = WebTestExecutionInstruction.Skip;【参考方案2】:

据我所知,您对 localhost 的虚拟请求的解决方案是最好的。但这里有另一种选择。

两部分:

(1) 一个负载测试插件,用于将负载测试开始时间复制到 web 测试上下文中:

[DisplayName("Load Test Start Time")]
[Description("Record the load test start time in the context of new web test iterations")]
public class LoadTestStartTime : ILoadTestPlugin

    public const string LoadTestStartTimeContextParameterName = "$LoadTestStartTime";

    public void Initialize(LoadTest loadTest)
    
        DateTime startTime = DateTime.Now;

        // Copy the load test start time into the context of each new test
        loadTest.TestStarting += (sender, e) =>
        
            e.TestContextProperties[LoadTestStartTimeContextParameterName] = startTime;
        ;
    

(2) 一个 web 测试插件,它从一个可以是静态值或上下文参数的属性中获取延迟时间,可以是 HH:MM:SS.SSS 或整数毫秒:

[DisplayName("Delay WebTest")]
[Description("Delay the start of this WebTest by a certain amount of time.")]
public class DelayWebTest : WebTestPlugin

    [Description("Time to delay this WebTest, in HH:MM:SS.SSS time format or in ms (e.g. 00:01:23.456 or 83456 for 1m 23.456s delay)")]
    public string Delay  get; set; 

    public override void PreWebTest(object sender, PreWebTestEventArgs e)
    
        DateTime start;
        // Make sure this works when not in a load test
        if (!e.WebTest.Context.ContainsKey("$LoadTestUserContext"))
            start = DateTime.Now;
        else
            start = (DateTime)(e.WebTest.Context[LoadTestStartTime.LoadTestStartTimeContextParameterName]);

        TimeSpan elapsed = DateTime.Now - start;
        TimeSpan delay;
        // Support context parameter substitutions
        if (Delay.StartsWith("") && Delay.EndsWith(""))
        
            string key = Delay.Substring(2, Delay.Length - 4);
            object value = e.WebTest.Context[key];
            if (value is TimeSpan) delay = (TimeSpan)value;
            else if (value is int) delay = new TimeSpan(0, 0, 0, 0, (int)value);
            else if (value is string) delay = ParseDelayFromString(value as string);
            else throw new ArgumentException("Delay value must be TimeSpan, int or string.  Found: " + value.GetType());
        
        else delay = ParseDelayFromString(Delay);

        TimeSpan sleep = delay - elapsed;
        if (sleep > new TimeSpan(0))
        
            e.WebTest.AddCommentToResult("Current time: " + DateTime.Now);
            e.WebTest.AddCommentToResult("About to sleep for " + sleep);
            System.Threading.Thread.Sleep(sleep);
            e.WebTest.AddCommentToResult("Current time: " + DateTime.Now);
        
    

    public static TimeSpan ParseDelayFromString(string s)
    
        TimeSpan ts;
        if (TimeSpan.TryParse(s, out ts)) return ts;
        int i;
        if (int.TryParse(s, out i)) return new TimeSpan(0, 0, 0, 0, (int)i);
        throw new FormatException("Could not parse value as TimeSpan or int: " + s);
    

这似乎对我有用。

但是它使用 Thread.Sleep “...不推荐用于 Web 测试是因为它是一种阻塞 API,并且多个 Web 测试可以共享一个线程,因此它会对多个 vuser 产生不利影响。” (See Visual Studio Performance Testing Quick Reference Guide) 第 187 页。

所以这对于单用户负载测试当然是可以的,也许对于虚拟用户数量不超过线程数的小负载*,但它可能会在更大负载时搞砸结果。

(* 我不声称知道线程模型是如何工作的)

【讨论】:

这个答案的主要部分是Thread.Sleep(...) 呼叫,这是我尝试的第一件事。正如您在回答中所说,它会阻塞整个线程,因此只能为极少数虚拟用户工作。请提供 VSPTQRG 中的页码。

以上是关于如何在delphi7中,测试一段代码的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取一段代码的执行时间?

delphi7 环境,如何自动提示代码

delphi等窗口完全显示后执行一段代码

Delphi7中快速得到本机IP地址

如何以可靠的方式测量执行一段代码所花费的时间?

Delphi7使用一段时间后抽风提示注册