Git   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了与Windows应用程序相比,相同的代码运行速度比GUI应用程序慢大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一些Delphi 2007的代码,运行在两个不同的应用程序,一个是GUI应用程序,另一个是Windows服务。 怪异的部分是,虽然GUI应用程序在技术上似乎有更多的“要做”,绘制graphics用户界面,计算一些统计等,Windows服务运行时一直使用更多的cpu。 如果GUI应用程序使用大约3-4%的cpu功率,则服务使用率在6-8%的区域内。

当它们一起运行时,两个应用程序的cpu负载大约加倍。

基本代码在两个应用程序中都是相同的,只是在Windows窗体应用程序中添加了GUI代码

这种行为有什么理由吗? Windows服务应用程序是否具有某种固有的开销,或者是否需要查看代码,以便在本书中发现意外的行为?

MysqL在Windows上命名pipe道 – 更快的最佳实践,或坏主意?

Java下的stream程创build过程如何?

现在是否值得实施一个slab分配器?

python – subprocess调用不使用pipe道时终止

Linux与Solaris的线程性能

编辑:

有时间仔细观察代码,我想下面的build议,GUI应用程序花费一些时间等待重新绘制,导致cpu负载下降可能是不正确的。 应用程序都是线程化的,这意味着GUI重绘不应该影响cpu负载

只是为了确保我第一次尝试从应用程序中删除所有的GUI组件,只留下一个空白的表单。 这并没有增加程序的cpu负载。 然后,我浏览了所有在用于更新UI的工作线程中的Synchronize调用。 这有同样的结果:cpu负载没有改变。

该服务中的代码如下所示:

procedure TLsOpcServer.ServiceExecute(Sender: TService); begin // Initialize OPC server as NT Service dmEngine.AddToLog( sevInfo,'Service','Name',Sender.Name ); AddLocalServiceKeysToRegistry( Sender.Name ); dmEngine.AddToLog( sevInfo,'Execute','Started' ); dmEngine.Start( True ); // while not Terminated do begin ServiceThread.ProcessRequests( True ); end; dmEngine.Stop; dmEngine.AddToLog( sevInfo,'Stopped' ); end;

dmEngine.Start将启动并注册OPC服务器并初始化一个套接字。 然后它启动一个线程,它可以处理传入的OPC信号。 在GUI应用程序的主窗体上的FormCreate中进行相同的确切调用

我将研究GUI应用程序如何开始下一步,我没有写这个代码,所以试图解开它是如何工作是一个冒险:)

EDIT2

这有点有趣。 我跑了两个应用程序每个正好1分钟,运行AQTime进行基准testing。 这是结果中最有趣的部分:

在服务中:

过程名称: TSignalList :: HandleChild

执行时间: 20.105963821084

Hitcount: 5961231

在GUI应用程序中:

过程名称: TSignalList :: HandleChild

执行时间: 7.62424101324976

点击次数: 6383010

编辑3:

我终于回到了可以继续关注这个问题的位置。 我发现两个程序在五分钟内都有相同的命中次数,而在服务中执行时间要高得多。 对于HandleValue来说,hitcount是4 300 258,执行时间是21.77s,在GUI应用程序中,hitcount是4 254 018,执行时间是9.75s。

代码如下所示:

function TSignalList.HandleValue(const Signal: string; var Tag: TTag; const CreateIfNotExist: Boolean): HandleStatus; var Index: integer; begin result := statusNoSignal; Tag := nil; if not Assigned( Values ) then begin Values := TValueStrings.Create; Values.CaseSensitive := defDefaultCase; Values.sorted := True; Values.Duplicates := dupIgnore; Index := -1; // Garantied no items in list end else begin Index := Values.IndexOf( Signal ); end; if Index = -1 then begin if CreateIfNotExist then begin // Value signal does not exist create it Tag := TTag.Create; if Values.AddObject( Signal,Tag ) > -1 then begin result := statusAdded; end; end; end else begin Tag := TTag( Values.Objects[ Index ] ); result := statusExist; end; end;

两个应用程序input的“CreateIfNotExist”大小写的次数完全相同。 TValueStrings是TStringList的直接后代,没有任何重载。

一个更快? 正则expression式或EndsWith?

什么是testingNFS性能的正确方法

embedded式Linux应用程序中的周期“滞后”

什么是从malloc()做的Windows和Linux本地操作系统/系统调用

为什么在使用多进程时,Windows和Linux之间cpu密集型任务的性能改进是不同的

你有时间执行核心功能吗? 如果是这样,你有没有测量差异? 我想,如果你这样做,除非你将其他功能,比如更新GUI,添加到该核心功能代码中,否则你将不会发现它们之间有太大的区别。

消耗更少的cpu并不意味着它运行得更慢。 GUI应用程序可能更经常地等待重绘,这也取决于GPU(也可能是系统的其他部分)。 因此,GUI应用程序可能会消耗更少的cpu电源,因为cpu在继续执行下一条指令之前正在等待系统的其他部分。

大佬总结

以上是大佬教程为你收集整理的与Windows应用程序相比,相同的代码运行速度比GUI应用程序慢全部内容,希望文章能够帮你解决与Windows应用程序相比,相同的代码运行速度比GUI应用程序慢所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: