none
VB.net代码执行效率的问题 RRS feed

  • 问题

  • 是这样的,在我的代码里,开了一个timer,定时50ms(我知道50ms是不怎么准的,但是由于项目本身的需要,先就定时50ms)

    然后有一段代码是循环被调用的。

    我和下位机做串口通信,发数据包,收到下位机的应答后,发送下一包数据。直到发完全部数据,数据包的长度是固定的(128byte)。

    我的问题是,每次从我收到下位机的应答,到我开始发送下一包数据的时间是不一样的。

    这个时间是个绝对时间,不依赖于下位机的应答,这段代码纯粹上位机的逻辑判断,数据赋值等,在包与包之间肯定是跑的相同的代码逻辑。

    但是不知为何,这个时间就是不准,有时4ms,有时6ms,有时18ms。

    这个是什么原因,我的主程序被什么东西中断了吗?被那个该死的timer?


    2013年11月20日 14:31

答案

全部回复

  • 很难说,有时候发送到接受会有延时产生,对于CPU而言1毫秒很多事情可以做了,何况是50毫秒!

    如果你要做,建议你开发一个Windows Service(用System.Timers.Timer进行操作,远比WinForm的Timer精准得多)。而且直接在后台自助式运行。

    参考:http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html


    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report

    2013年11月21日 4:04
    版主
  • 很难说,有时候发送到接受会有延时产生,对于CPU而言1毫秒很多事情可以做了,何况是50毫秒!

    如果你要做,建议你开发一个Windows Service(用System.Timers.Timer进行操作,远比WinForm的Timer精准得多)。而且直接在后台自助式运行。

    参考:http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html


    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report

    谢谢你的建议!

    首先,这个50ms的timer并不是用来处理我的那段代码的。

    我的问题是:

    纯粹是我自己的应用代码(比如for 循环赋值),它是个绝对值(每次我就只计算从我收到ACK到我下次发送之前的这段时间),相同的逻辑,相同的代码量,这个是死的,但是它的执行时间都会不一样。我已经不考虑下位机下位机的发送延时了,就是从我收到下位机的ACK后,开始跑这段代码(主要是数据准备),这样都能每次不一样,这是为什么?

    比如下面的测试代码:

    Private Sub Test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Test.Click
        Dim i As Integer
        Dim testData(128) As Integer
        
        RichTextBox4.AppendText("Prepare data:" & " " &  CStr(DateTime.Now) & " " & DateTime.Now.Millisecond & vbCr)
        For i = 0 To 128
            testData(i) = i
        Next
        RichTextBox4.AppendText("Prepare data OK:" & " " & CStr(DateTime.Now) & " " & DateTime.Now.Millisecond & vbCr)
    End Sub

    多数时候,1ms之内就能搞定for循环,但是实际测试结果,有的时候用了5ms,有的时候10多ms,我甚至测到30ms的。

    Prepare data: 2013-11-22 14:14:26 989
    Prepare data OK: 2013-11-22 14:14:26 989
    Prepare data: 2013-11-22 14:14:27 738
    Prepare data OK: 2013-11-22 14:14:27 738
    Prepare data: 2013-11-22 14:14:28 548
    Prepare data OK: 2013-11-22 14:14:28 548
    Prepare data: 2013-11-22 14:14:29 281
    Prepare data OK: 2013-11-22 14:14:29 281
    Prepare data: 2013-11-22 14:14:29 936
    Prepare data OK: 2013-11-22 14:14:29 952
    Prepare data: 2013-11-22 14:14:30 700
    Prepare data OK: 2013-11-22 14:14:30 700
    Prepare data: 2013-11-22 14:14:31 496
    Prepare data OK: 2013-11-22 14:14:31 496
    Prepare data: 2013-11-22 14:14:32 88
    Prepare data OK: 2013-11-22 14:14:32 88
    Prepare data: 2013-11-22 14:14:32 727
    Prepare data OK: 2013-11-22 14:14:32 727
    Prepare data: 2013-11-22 14:14:33 554
    Prepare data OK: 2013-11-22 14:14:33 554
    Prepare data: 2013-11-22 14:14:34 427
    Prepare data OK: 2013-11-22 14:14:34 427
    Prepare data: 2013-11-22 14:14:35 113
    Prepare data OK: 2013-11-22 14:14:35 113


    2013年11月22日 14:24
  • Timer不是非常精准的定时工具,所以还是建议用System.Threading.Timer,注意和UI交互的时候用this.Invoke。

    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report

    2013年11月23日 2:17
    版主