2015-05-28 48 views
0

我有這樣的代碼:.NET for循環性能問題

namespace FrequencyGeneratorConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Thread.CurrentThread.Priority = ThreadPriority.Highest; 

      int from = 100000;// Convert.ToInt32(txtFrom.Text); 
      int to = 999999;//Convert.ToInt32(txtTo.Text); 
      int numbers = 2000; //Convert.ToInt32(txtNumbers.Text); 
      int range = 50;// Convert.ToInt32(txtRange.Text); 

      var generatedFrequencies = new List<Frequency>(to - from); 
      var availableRanges = new List<AvailableRange>(to - from + 1); 

      //AvailableRange maxAvailableRange = new AvailableRange(); 

      var random = new Random(); 

      DateTime first = DateTime.Now; 

      for (int i = 0; i < numbers; i++) 
      { 
       var frequency = new Frequency(); 

       if (availableRanges.Count == 0) 
       { 
        frequency.Number = random.Next(from, to); 
        frequency.Number = (int)Math.Round((decimal)frequency.Number/5) * 5; 
        int fromValue = frequency.Number - (range/2); 
        int toValue = frequency.Number + (range/2); 

        frequency.From = fromValue < from ? from : fromValue; 
        frequency.To = toValue > to ? to : toValue; 

        generatedFrequencies.Add(frequency); 

        var availableRange1 = new AvailableRange { From = @from, To = frequency.From }; 
        availableRange1.RangeLong = availableRange1.To - availableRange1.From; 
        availableRanges.Add(availableRange1); 

        var availableRange2 = new AvailableRange { From = frequency.To, To = to }; 
        availableRange2.RangeLong = availableRange2.To - availableRange2.From; 
        availableRanges.Add(availableRange2); 
       } 
       else 
       { 
        DateTime d1 = DateTime.Now; 
        int max = 0, index = 0; 

        for (int j = 0; j < availableRanges.Count; j++) 
        { 
         if (availableRanges[j].RangeLong > range) 
         { 
          index = j; 
         } 


        } 

        DateTime d2 = DateTime.Now; 
        double total1 = (d2 - d1).TotalMilliseconds; 

        AvailableRange availableRange = availableRanges[index]; 

        if (availableRange.RangeLong <= range) 
        { 
         Console.WriteLine("there is no available pathes " + generatedFrequencies.Count); 

         break; 
        } 

        DateTime d3 = DateTime.Now; 
        double total2 = (d3 - d2).TotalMilliseconds; 

        frequency.Number = random.Next(availableRange.From + (range/2), availableRange.To - (range/2)); 
        frequency.Number = (int)Math.Round((decimal)frequency.Number/5) * 5; 
        int fromValue = frequency.Number - (range/2); 
        int toValue = frequency.Number + (range/2); 

        frequency.From = fromValue < from ? from : fromValue; 
        frequency.To = toValue > to ? to : toValue; 
        generatedFrequencies.Add(frequency); 

        var availableRange1 = new AvailableRange { From = availableRange.From, To = frequency.From, RangeLong = frequency.From - availableRange.From }; 
        availableRanges.Add(availableRange1); 

        //availableRange.From = 1; 


        var availableRange2 = new AvailableRange { From = frequency.To, To = availableRange.To, RangeLong = availableRange.To - frequency.To }; 
        availableRanges.Add(availableRange2); 

        //availableRange.To = frequency.From; 
        //availableRange.RangeLong = availableRange.To - availableRange.From; 


        DateTime d4 = DateTime.Now; 
        double total3 = (d4 - d3).TotalMilliseconds; 

        //availableRange.RangeLong = 0; 
        availableRanges.RemoveAt(index); 

        DateTime d5 = DateTime.Now; 
        double total4 = (d5 - d4).TotalMilliseconds; 

        double total = (d5 - d1).TotalMilliseconds; 
        if (total > 1) 
        { 
         // Console.WriteLine(total + @"  :  " + total1 + @"  :  " + total2 + @"  :  " + total3 + @"  :  " + total4 + 
         // @" frequency  :  " + frequency.Number + @" max :  " + max + @" index :  " + index); 
        } 
       } 

      } 
      DateTime last = DateTime.Now; 
      Console.WriteLine((last - first)); 

      Console.ReadLine(); 
     } 
    } 


    public class Frequency 
    { 
     public int From { get; set; } 
     public int To { get; set; } 
     public int Number { get; set; } 
     public override string ToString() 
     { 
      return " from : " + From + " to : " + To + " number : " + Number; 
     } 
    } 

    public class AvailableRange 
    { 
     public int From { get; set; } 
     public int To { get; set; } 
     public int RangeLong { get; set; } 

     public override string ToString() 
     { 
      return " from : " + From + " to : " + To + " RangeLong : " + RangeLong; 
     } 
    } 
} 

現在的問題是這個代碼需要一些時間 當我分析的代碼我期待着某些週期需要15毫秒,人取0毫秒 如果循環的數量小,這個問題不會出現 我試圖解決這個問題,但我找不到回答 什麼問題

+0

我建議你使用'Math.Round(... MidpointRounding.AwayFromZero)'。它通常比較容易理解,因爲它是他們在學校教的四捨五入(.5舍入) – xanatos

+0

謝謝,但真正的問題聽不到,如果你設置從1000000和至9999999和數字20000問題將會變成 –

+0

我做了拖曳注意你說但問題仍然 –

回答

0

我認爲你不能得到準確的測量,因爲這是一個用戶模式代碼運行在多任務環境中ENT。即使線程優先級設置爲最高,它也可以被任何內核模式進程取代。

+0

問題是爲什麼一些週期需要0毫秒和其他需要15毫秒的結果是不合理的 –

2

不使用DateTime進行性能測量。使用System.Diagnostics.Stopwatch