通过取5次发送字节的平均值来计算发送文件速度/秒

时间:2012-01-27 07:44:46

标签: c# performance average transfer

我试图用平均值计算每秒的传输文件速度 我在发送的字节总和 prevSum 之间采取了不同的每秒5次

  • 下面的代码能给我正确的速度吗?
  • 我应该更改费率数组大小吗?
  • 或者我应该更改Thread.Sleep(值)?
    我很困惑,因为每次改变一个小东西时速度值都会改变..那是什么?#p>

        static long prevSum = 0;
        static long[] rate = new long[5];
        private static void SpeedPerSec(object o)
        {
            fileProgress fP = (fileProgress)o; //get the form conrtols
            while (busy)    // while sending file is active
            {
                for (int i = 0; i < rate.Length; i++)
                {
                    //diff between the sent bytes and prev sent bytes
                    rate[i] = (sum - prevSum);
                    Thread.Sleep(1000/rate.Length);
                }
                prevSum = sum;
                fP.RateLabel(Convert.ToInt64(rate.Average()));   
                //print the trasnfer rate which take a long value .. it just print the value in MB or KB string
            }
        }
    

    这是sendFile代码:

        public static bool busy = false;
        public static Socket client;
        public static int packetSize = 1024*8;
        public static int count = 0;
        public static long fileSize;
        public static long sum = 0;
    public static void sendFile(string filePath)
        {
            // run the progres Form
            Thread thFP = new Thread(fpRUN);
            fileProgress fP = new fileProgress("Sending...");
            thFP.Start(fP);
    
            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            string fileName = Path.GetFileName(filePath);
            byte[] fileData;
            try
            {
                //sending file name and file size to the server
                busy = true;
                fileSize = fs.Length;
                byte[] fileDetial = null;
                string detail =  fileName + "," + fileSize.ToString();
                fileDetial = Encoding.ASCII.GetBytes(detail);
                client.Send(fileDetial);
    
                //sending file data to the server
    
                fileData = new byte[packetSize];
                count = 0;
                sum = 0;
    
                Thread thSpeed = new Thread(SpeedAndTimeLeft); //*here the thread of SPEED per second method
                thSpeed.Start(fP);
                fP.SizeLabel(fileSize);                     // tell the form the file size
                Thread thClock = new Thread(fP.clock);
                thClock.Start();
                while (sum < fileSize)
                {
                    fs.Seek(sum, SeekOrigin.Begin);
                    fs.Read(fileData, 0, fileData.Length);
                    count = client.Send(fileData, 0, fileData.Length, SocketFlags.None);
                    sum += count;
                    fP.ProgressBarFileHandler(sum,fileSize);        //progressbar value
                    fP.SentLabel(sum, fileSize);                    //tell the form how much sent                }
            }
            finally
            {
                busy = false;
                fs.Close();
                fileData = null;
                MessageBox.Show(string.Format("{0} sent successfully", fileName));
            }
        }
    
  • 2 个答案:

    答案 0 :(得分:1)

    我不明白你为什么要使用long [] rate变量...如果你想计算传输速率并每秒更新一次,你应该将当前的fileSize存储在一个变量中,然后在睡眠后看到新的fileSize。然后从新的文件中减去先前的fileSieze,并获得最后一秒的传输速率(实时传输速率)。对于一般传输速率,您应该通过在下载/上传开始时采用时间戳来计算它,然后,在每次睡眠之后通过将当前fileSize除以到目前为止的总秒数来计算速率。

    答案 1 :(得分:0)

    不是每次计算平均值(如果你的费率数组变得非常大,可能会变慢),你可以用这种方式计算。

    为了这个例子,请考虑你的费率

    long[] rates = new long[] { 5, 1, 3,4 ,2 ,5, 1};
    

    你可以像这样计算每一步的平均值:

    double currentAverage = 0;
    for (int i = 0; i < rates.Length; i++)
    {
       long currentRate = rates[i];
       int iteration = i + 1;
       currentAverage = (currentAverage * i + currentRate) / iteration;
    }
    

    然后等一下每个费率样本。