当连接两台联网的计算机时,我有一个约40毫秒的延迟,我试图找到原因。我怀疑服务器应用程序是原因。我已经使用其他软件(即Hercules)检查了滞后与我的软件有关,我考虑过传输位而不是字符串。拥塞可能不是原因,但可能是缓冲区和数据包大小 - 考虑到我在一些早期RFC文档中读到的内容。我认为延迟是由于服务器而不是客户端,虽然这只是我的猜测。我用ActionScript编写了客户端。
我问这个问题是关于关键字TCP / IP的Google搜索和优化会返回TCP / IP配置上的结果而不是实现。我是TCP / IP编程的新手,所以我希望这个错误很容易被一个更高级的程序员发现。
服务器应用程序在VB.NET中编程:
Public Class Form1
Public Shared remoteAddress As IPAddress = IPAddress.Any
Public Shared port As Int32 = 8080
Public Shared server As New TcpListener(remoteAddress, port)
Public client As TcpClient = Nothing
'....
While (True)
Try
Dim buffer(65536) As Byte
Dim stuff As Integer = client.ReceiveBufferSize
Console.WriteLine(stuff)
networkStream.Read(buffer, 0, CInt(client.ReceiveBufferSize))
Dim dataFromClient As String = System.Text.Encoding.ASCII.GetString(buffer)
dataFromClient = dataFromClient.Substring(dataFromClient.IndexOf("/") + 1, dataFromClient.IndexOf("\") - 1)
If dataFromClient Like "/END\" Or dataFromClient Like "/STOP\" Then
Console.WriteLine("STOP REQUESTED")
Exit While
End If
SetMarker(dataFromClient)
Console.WriteLine(dataFromClient)
Dim serverResponse As String = "Receiving marker #" + Convert.ToString(requestCount) + ": " + dataFromClient
Dim sendBytes As [Byte]() = System.Text.Encoding.ASCII.GetBytes(serverResponse)
networkStream.Write(sendBytes, 0, sendBytes.Length)
networkStream.Flush()
Console.WriteLine(serverResponse)
Catch illegalSyntax As System.ArgumentException
Console.WriteLine("ERROR: Use correct syntax: /command\ Example: /S1\, /STOP\")
Catch socketEx As SocketException
Console.WriteLine(SocketError.Interrupted)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
requestCount = requestCount + 1
End While
答案 0 :(得分:1)
一些想法: 从最小的可能程序开始,并测量性能。慢慢添加功能,当性能达到不可接受的水平时,您将知道程序的哪个部分花费的时间最多。
为此,您尝试添加一些基本的分析代码,以查看花费最多时间的位置,并意识到额外的代码需要额外的时间来处理。
为了做到这一点,也许使用Environment.TickCount来衡量时间。我认为还有其他一些高性能定时器。
那就是说,我开始在几个地方寻找:
- 您正在紧密循环的顶部分配一个数组。为什么不在循环外声明数组,然后清除它,或者更有效,跟踪正在使用的数组项,并相应地调整代码。
- 通过将字符串变量重新分配给自身,您将导致分配一个全新的字符串。而不是重新分配子字符串,也许做一个String.contains来检查你的条件
-Like是模式匹配关键字。尝试使用相等来测试您的情况。模式匹配比测试平等更昂贵。
- 你正在调用一个名为SetMarker的函数,我们没有定义。这个功能在做什么?写入数据库或文件?还有什么?也许这个功能很慢。