游戏开发论坛

 找回密码
 立即注册
搜索
楼主: winspy

对VB的效率不满意?原因可能出在你自己身上哦!

[复制链接]

14

主题

163

帖子

178

积分

注册会员

Rank: 2

积分
178
QQ
发表于 2005-11-21 20:18:00 | 显示全部楼层

Re:对VB的效率不满意?原因可能出在你自己身上哦!

这段代码没有在VC编译,目前我用的GCC,谁有兴趣把代码用VC编译一下。

14

主题

163

帖子

178

积分

注册会员

Rank: 2

积分
178
QQ
发表于 2005-11-21 20:28:00 | 显示全部楼层

Re:对VB的效率不满意?原因可能出在你自己身上哦!

(名字修正,“第二次的也成第一次了”)
贴出最终代码我也只能达到这步了,哪位高手继续优化,就算为了给C/C++的程序员争气)
C代码:
#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[])
{
    register unsigned long i=100000000,d=0,d1=10;
    DWORD st=GetTickCount();
    /*其实这样优化才是程序员的本质
    if (i%10==0) while(i>0){i-=10;d+=10;}
    else if(i%4==0) while(i>0){i-=4;d+=4;}
    else if(i%2==0) while(i>0){i-=2;d+=2;}
    else while(i>0){i-=1;d+=1;}*/

    while(i>0){i-=1;d+=1;}       /*为了比速度只好麻烦点*/
    printf("d的结果(第一次):%d\n",d);
    while(i<5){++i;d1=(d1<<3)+(d1<<1);}
    printf("d的结果(第二次):%d\n一共执行时间:%d毫秒\n",d1,GetTickCount()-st);
    system(&quotAUSE");
    return 0;
}

----------------------------------------
初级代码优化:
1.上面加重的部分有利于程序的执行,就是所谓的"贪心"的政策,本来一个循环只能加一,但利用上面的代码可以一次加10,甚至1000,这种优化一定很快(大多数情况下)
2.寄存器优化,"register +变量申请格式",利用在寄存器里的速度优势,大多数的情况比内存的访问是快的,因为我用VB用的不是很深,如果有,尽量也用这个优化,特别是计算速度要求特别高的情况下.
3.while(i<5){++i;d1=(d1<<3)+(d1<<1);}
   我没有用 *10 而用了两个移位指令,我觉得二进制的运算总是快的,<<3 相当于 *2^3=*8 再加上 <<1=*2^1=*2 正好是*10,这个我没有仔细验证,优化多少我也不清楚,有兴趣大家可以测试一下.
4.大家可以看我最早的代码,在第一次的时候,一个变量第一次我请0,汇编就是"mov eax,0" (假如不优化,变量是寄存器变量"register"),这样一直加到目的数,这样后面会多出N条语句,合理利用语句的位置和加减关系也是基本程序员需要的素质。
5.++i 和 i++ 的问题,如果不是y=(i++)+1这种样的话,你完全可以把i++变成++i,据说能提高不少速度,VB相关的我不知道,其实是一个自增的运算符,VB 的 x=x-1,会变成汇编代码 "sub x,1" 而同样的自减的汇编代码是"dec x",既节省文件的大小,而且加快了速度,不知VB家族有没有,有尽量不要用"x=x+1"等等这种的语句了。
------------------------------------------
感谢 liiir1985 提供 与本优化相关的VB代码,现在用VB的不妨看看他的代码,肯定会有所帮助的

18

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2005-11-21 20:44:00 | 显示全部楼层

Re: 对VB的效率不满意?原因可能出在你自己身上哦!

又吵成这个样子了,唉。。。。。。

煮豆燃豆箕
豆在釜中泣
本是同根生
相煎何太急

去WC一下

18

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2005-11-21 20:46:00 | 显示全部楼层

Re: 对VB的效率不满意?原因可能出在你自己身上哦!

Option Explicit

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Dim t_One As Long, t_Two As Long
Dim sTemp As String, sTime As String
Dim i As Long

Private Sub Command1_Click()
    t_One = timeGetTime()
    For i = 1 To 50000
        sTemp = Str(i)
    Next
    t_Two = timeGetTime()
   
    sTime = (t_Two - t_One) / 1000
   
    Text1.Text = sTemp & " | " & sTime
End Sub
使用数组再试一次
以前我写过一篇关于VB各种循环速度的测试,找不到了。

[em7]

18

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2005-11-21 20:55:00 | 显示全部楼层

Re: 对VB的效率不满意?原因可能出在你自己身上哦!

[em7]
sf_20051121205451.jpg

14

主题

163

帖子

178

积分

注册会员

Rank: 2

积分
178
QQ
发表于 2005-11-21 20:59:00 | 显示全部楼层

Re:对VB的效率不满意?原因可能出在你自己身上哦!

没错啊,1000000次的,不信你用我的源代码改改试试.

18

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2005-11-21 21:00:00 | 显示全部楼层

Re: 对VB的效率不满意?原因可能出在你自己身上哦!

[em7]
sf_20051121205947.jpg

14

主题

163

帖子

178

积分

注册会员

Rank: 2

积分
178
QQ
发表于 2005-11-21 21:22:00 | 显示全部楼层

Re:对VB的效率不满意?原因可能出在你自己身上哦!

VB的加减都会涉及到动态库,速度自然慢了

14

主题

163

帖子

178

积分

注册会员

Rank: 2

积分
178
QQ
发表于 2005-11-21 21:26:00 | 显示全部楼层

Re:对VB的效率不满意?原因可能出在你自己身上哦!

100000的那个其实最大是15毫秒,最小接近0,请大家多试几遍.

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2005-11-21 21:30:00 | 显示全部楼层

Re:对VB的效率不满意?原因可能出在你自己身上哦!

我刚才做了一下测试~
先是vb.net,代码先:
    Private Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Integer
    Sub Main()
        Dim st As Integer = GetTickCount
        Dim i As Integer = 0, d As Integer = 2
        Do While i < 100000000
            i = i + 1
            d = d + 1
        Loop
        Console.WriteLine("d的结果(第一次):" & d & vbCrLf)
        i = 0
        d = 10
        Do While i < 5
            i = i + 1
            d = d + d + d + d + d + d + d + d + d + d
        Loop
        Console.WriteLine("d的结果(第二次):" & d & vbCrLf)
        Console.WriteLine("一共执行时间:" & GetTickCount - st & "毫秒" & vbCrLf)
    End Sub

测试结果:
平均值:541毫秒
现在VB:
    Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Form_Load()
        Dim st As Long, temp As String
        st = GetTickCount
        Dim i As Long, d As Long
        i = 0
        d = 2
        Do While i < 100000000
            i = i + 1
            d = d + 1
        Loop
        temp = "d的结果(第一次):" & d & vbCrLf
        i = 0
        d = 10
        Do While i < 5
            i = i + 1
            d = d + d + d + d + d + d + d + d + d + d
        Loop
        temp = temp & "d的结果(第二次):" & d & vbCrLf
        MsgBox (temp & "一共执行时间:" & GetTickCount - st & "毫秒" & vbCrLf)

End Sub

测试结果:5548毫秒……………………………………………………………………………………………………………………………………………………………………………………………………………………………………

vb居然比vb.net慢10倍,同样的代码~
谁有编译好的c++的执行程序,我在我机器上测试一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 19:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表