рассчитать скорость отправки файла в секунду, взяв среднее значение 5 раз отправленных байтов

im trying to calculate the transfer file speed per second using the average
i took the different between the sent bytes sum and the prevSum 5 times per second

  • does the code below give me the correct speed?
  • should i change the rate array size ?
  • or should i change Thread.Sleep(value) ?
    im so confused because each time a change a little thing the speed value changes.. what's the correct solution for that ??

        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));
            }
        }
    

  • person Murhaf Sousli    schedule 27.01.2012    source источник
    comment
    сумма не определена и ей не присвоено значение в вашем фрагменте кода   -  person Jan    schedule 27.01.2012
    comment
    Обратите внимание, что prevSum не инициализируется повторно при каждом вызове метода SpeedPerSec. Вы уверены, что «скорость» - это скорость, а не просто количество переданных байтов? Я думаю, вам нужно будет дать более подробную информацию о том, что вы пытаетесь сделать, прежде чем кто-то сможет помочь.   -  person g t    schedule 27.01.2012
    comment
    Сумма @JAN - это статическое длинное значение, которое представляет собой текущие отправленные байты.   -  person Murhaf Sousli    schedule 27.01.2012
    comment
    @gt SpeedPerSec, вызываемый один раз .. внутри потока .. prevSum - это сумма последних отправленных байтов .. сумма - это текущие отправленные байты .. скорость - это разница между ними   -  person Murhaf Sousli    schedule 27.01.2012
    comment
    Как я уже сказал в stackoverflow.com/questions/9029218/ нет правильного кода для отображения текущего скорость передачи так, что приятно смотреть. Ваш предыдущий код не давал приятного результата с интервалом в 1 секунду, я сомневаюсь, что вы получите более хорошие результаты с меньшими интервалами - ваш звонок.   -  person Alexei Levenkov    schedule 28.01.2012
    comment
    Лично я вычислил бы среднюю скорость для всей загрузки. Затем среднее значение будет сглаживаться по мере увеличения продолжительности загрузки. Если они длиннее, вы можете реализовать скользящее окно, как упоминалось в ваших ответах.   -  person Mark Hall    schedule 28.01.2012


    Ответы (2)


    Я не понимаю, почему вы используете переменную скорости long[]... Если вы хотите рассчитать скорость передачи и обновлять ее каждую секунду, вы должны сохранить текущий размер файла в переменной, а затем после сна увидеть новый размер файла . Затем вычтите предыдущий fileSieze из нового, и вы получите скорость передачи за последнюю секунду (скорость передачи в реальном времени). Для общей скорости передачи вы должны рассчитать ее, взяв метку времени, когда загрузка/выгрузка началась, а затем, после каждого сна, рассчитать скорость, разделив текущий размер файла на общее количество секунд, прошедших до сих пор.

    person Alex Calugarescu    schedule 27.01.2012
    comment
    Размер файла является константой. Вы хотите, чтобы я инициализировал переменную, которая содержит размер файла - сумма (отправленные байты) ?? я не думаю, что это имеет смысл! long[] rate, чтобы получить среднее количество отправленных байтов в секунду. Это позволяет избежать увеличения и уменьшения скорости, например: (30 МБ/сек, затем 5 МБ/сек, затем 25 МБ/сек, затем 4 МБ/сек) - person Murhaf Sousli; 27.01.2012
    comment
    Вы сказали скорость файла и не упомянули, где вы делаете загрузку или загрузку. В любом случае, если вы выполняете загрузку, будет достаточно подсчета общего количества отправленных байтов. Затем после каждого сна деление на общее количество секунд, прошедших до сих пор, даст вам общую скорость передачи (вам не нужно проверять скорость передачи 10 раз в секунду, а только когда вы ее обновляете). - person Alex Calugarescu; 27.01.2012
    comment
    извините, я забыл сказать, что приложение предназначено для .. ОТПРАВКИ ФАЙЛА С ИСПОЛЬЗОВАНИЕМ TCP SOCKETS C # от клиента к серверу .. сейчас я использую секундомер и проверяю при отправке файла .. если Elapsed.Seconds == 1 .. для печати суммы- prevSum, затем сбросьте секундомер.. и он работает, но значение все еще увеличивается и уменьшается :( - person Murhaf Sousli; 27.01.2012
    comment
    я обновил код .. я надеюсь, что это поможет - person Murhaf Sousli; 27.01.2012

    Вместо того, чтобы каждый раз вычислять среднее значение (что может стать медленным, если ваш массив ставок становится очень большим), вы можете вычислить его таким образом.

    считайте ваши ставки такими, ради этого примера

    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;
    }
    

    Затем просто подождите секунду для каждого образца скорости.

    person joaomgcd    schedule 27.01.2012
    comment
    что делает этот код?? это просто вместо rate.Average(); ?? не думаю, что это что-то изменит!! - person Murhaf Sousli; 27.01.2012