查看: 1186|回复: 14
|
[询问] Windows 和 Console Application 之效率
[复制链接]
|
|
一般下 Console 程式的执行效率都会比 Window 程式快。
小章鱼想请教,如果 Window 程式在没有开启任何 Form 的情况下和 Console 执行同样的咚咚,
其效率会否和 Console 程式一样呢?
小章鱼的目的是要做高效能的程式,程式是一直处在无尽回路中的。
原 Console 应该是最好的选择,不过由于程式本身有时候又需要界面,
所以想请教 Window 程式在关闭所有的 form 后只留下一个无尽回路,执行效率会否提高(近 Console 效率)?
谢谢 |
|
|
|
|
|
|
|
发表于 21-5-2006 11:30 PM
|
显示全部楼层
我猜想这样做的话... 你的程序会当掉整个 windows. 但首先想了解的是, 你的无尽回路是怎么一回事? |
|
|
|
|
|
|
|
发表于 22-5-2006 10:45 AM
|
显示全部楼层
原帖由 sson 于 21-5-2006 08:27 AM 发表
一般下 Console 程式的执行效率都会比 Window 程式快。
小章鱼想请教,如果 Window 程式在没有开启任何 Form 的情况下和 Console 执行同样的咚咚,
其效率会否和 Console 程式一样呢?
小章鱼的目的是要做高 ...
其實就算你的 form 打開, 如果不需要 refresh / update form
你可以 LockWindowUpdate, 那麼 windows 不會處理你的 form
會快不少 |
|
|
|
|
|
|
|
发表于 22-5-2006 10:51 AM
|
显示全部楼层
参考一下Multi Threading。当程式需要在background操作的话,Thread会和Windows妥协,达到最佳作业效率。 |
|
|
|
|
|
|
|
发表于 22-5-2006 02:17 PM
|
显示全部楼层
原帖由 sson 于 21-5-2006 08:27 AM 发表
一般下 Console 程式的执行效率都会比 Window 程式快。
小章鱼想请教,如果 Window 程式在没有开启任何 Form 的情况下和 Console 执行同样的咚咚,
其效率会否和 Console 程式一样呢?
小章鱼的目的是要做高 ...
无尽回路 = infinite loop?
据我所知。。。每个在os里运行的程序都应该有无尽回路。。。
如果,我没猜错的话。。。用vb6,vb.net,c#,foxprol,dephi,java等等compiler来制作windows程序(有Form),compiler都会帮我们制作一个看不到的infinite loop。。。
这个loop主要是用来执行TranslateMessage和DispatchMessage,再用GetMessage来断定loop的中止。。。
DispatchMessage会把window message送回给WndProc。。。之后,WndProc再分析window message。WndProc这个部分就是处理各种keyboard,mouse event。。。
.net已经可以override WndProc,不过loop的地方应该还不能控制。。。
console程序没有form这个部分。。。缺少了隐藏着的loop,所以用console作无尽回路的效果会比较好。。。 |
|
|
|
|
|
|
|

楼主 |
发表于 22-5-2006 10:19 PM
|
显示全部楼层
goatstudio
无尽回路,嗯……
- while(!terminated){
- // terminated 只在结束程式时才会 true
- }
复制代码
yongkahfai 程式是双线程的,不过双线程都是无尽回路
flashang Form 打开后会 refresh/update 的,
只是在用完后就会 disposed 。
小章鱼测试过,感觉一样,不过想真正的了解,是不是真的一样。
meemee 对,无尽回路 = infinite loop
是的,Form 本是一个无尽回路,不过那是由系统的主回路来管理的吧,
所以资源耗损度是和自己创造的无尽回路应该是天壤之别,对吧?
对不起,小章鱼对系统实在是不了解,如有错请各位指点。
[ 本帖最后由 sson 于 22-5-2006 10:22 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 23-5-2006 11:15 AM
|
显示全部楼层
|
|
|
|
|
|
|

楼主 |
发表于 23-5-2006 12:08 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 23-5-2006 04:24 PM
|
显示全部楼层
回复 #6 sson 的帖子
Form 本是一个无尽回路,不过那是由系统的主回路来管理的吧
你的说法应该也对。。。
不过,如果是比较low-level的做法,这个回路就必须自己编写和控制。
Creating a Message Loop
The system automatically creates a message queue for each thread. If the thread creates one or more windows, a message loop must be provided; this message loop retrieves messages from the thread's message queue and dispatches them to the appropriate window procedures.
Because the system directs messages to individual windows in an application, a thread must create at least one window before starting its message loop. Most applications contain a single thread that creates windows. A typical application registers the window class for its main window, creates and shows the main window, and then starts its message loop — all in the WinMain function.
You create a message loop by using the GetMessage and DispatchMessage functions. If your application must obtain character input from the user, include the TranslateMessage function in the loop. TranslateMessage translates virtual-key messages into character messages. The following example shows the message loop in the WinMain function of a simple Windows-based application.
如果,是vb,.net和java,它们都是处于virtual machine的状态。我猜测它们回路应该是在wm那里控制。。。
至于,foxprol,delphi,我还没有机会diassemble它们的程序。。。还猜不到它的回路在那里。
我的看法是,不会有很大的影响。。。因为那个隐藏着的回路是由.net frame制作出来,然后会跟着dispose消失。
即使用flashang的方法,应该也不会多大影响。
[ 本帖最后由 meemee 于 23-5-2006 04:34 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 27-5-2006 05:18 AM
|
显示全部楼层
所以想请教 Window 程式在关闭所有的 form 后只留下一个无尽回路,执行效率会否提高(近 Console 效率)?
真的要比較,就用profiler測量程式執行時間才準確。在.NET 2有一个Stopwatch class供簡單的測量。
另外,你也可以調整thread的priority來提高效率。
如果,是vb,.net和java,它们都是处于virtual machine的状态。我猜测它们回路应该是在wm那里控制。。。
至于,foxprol,delphi,我还没有机会diassemble它们的程序。。。还猜不到它的回路在那里。
.NET 的 Application.Run 就是GetMessage和DispatchMessage的迴路,Delphi亦是。 |
|
|
|
|
|
|
|

楼主 |
发表于 30-5-2006 08:26 AM
|
显示全部楼层
meemee 和 fxam 细心为小章鱼解。
fxam 不想用强制 high priority 的方式(这是用户选项)
在几番测试后觉得真的差不远,详细的只有在程式大致架构完成后再测试才能做准了,
毕竟目前只是一个简单的空壳子测试罢了。
不过实际上程式的设计在 UI 上从 WinFrm 转 Console 也没有太多的问题,
就是懒,想动工后就朝一个方向不更改 |
|
|
|
|
|
|
|
发表于 1-6-2006 09:13 AM
|
显示全部楼层
我认为不可因为追求完美的效率而牺牲易用性,那些3D软件不也有华丽的界面吗?没有易用的界面,相信你的研发过程也会很辛苦。 |
|
|
|
|
|
|
|

楼主 |
发表于 4-6-2006 10:34 AM
|
显示全部楼层
Jezz 你说得是,不过有些程式基本上没有什么“易用性”的需要,
试问如果一个程式执行后,界面上只有一个 Quit 按键,那么这 Winfrm 程式和 Console 程式 Press Enter to quit 的所谓“易用性”没有差吧。
所以在这情况下,咱们当然是不考虑的优先采取效率咯。
再者,在某些情况下,有时候效率和“易用性”也是需要取舍的。 |
|
|
|
|
|
|
|
发表于 6-6-2006 05:25 PM
|
显示全部楼层
錯錯錯,如果WinForm及console都沒有需要太多的UI的話,那它們的速度會差不了多少的。 |
|
|
|
|
|
|
|

楼主 |
发表于 9-6-2006 05:00 PM
|
显示全部楼层
馬拉棧 此帖的用意就是求证 WinForm 和 Console 在近零界面时效率究竟差多少。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|