2010-04-09 5 views
0

Я создаю проект в C# .net. мой процесс выполнения очень медленный. Я также нашел причину этого. В одном методе я скопировал значения из одного списка в другой. Этот список состоит из 3000 значений для каждой строки. Как я могу ускорить этот process.any тело помочь мнеКак увеличить скорость моего выполнения

for (int i = 0; i < rectTristrip.NofStrips; i++) 
      { 
       VertexList verList = new VertexList(); 
       verList = rectTristrip.Strip[i]; 
       GraphicsPath rectPath4 = verList.TristripToGraphicsPath(); 
       for (int j = 0; j < rectPath4.PointCount; j++) 
       { 
        pointList.Add(rectPath4.PathPoints[j]); 
       } 

      } 

Это код замедлит мой procees.Rect tristirp состоит много вершин каждой вершины имеет более 3000 значений ..

+0

Если вы не разделяете какой-либо код, показывающий, как это делается сегодня, невозможно сказать. –

+2

У меня есть одно слово для вас: профиль. –

+0

@musicfreak wht является soln для этого wht do wnt сказать – ratty

ответ

3

профайлер покажет вы точно сколько времени тратится на какие линии и которые наиболее важны для оптимизации. Красные ворота делают очень хороший.

http://www.red-gate.com/products/ants_performance_profiler/index.htm

+0

Я согласен с Сэмом. Другой очень хороший профилировщик: http://www.jetbrains.com/profiler/. у вас есть 30-дневная бесплатная пробная версия – PierrOz

0

Как musicfreak уже упоминалось, вы должны свой код, чтобы получить достоверный результат о том, что происходит. Но некоторые процессы занимают некоторое время.

В некотором роде вы не можете избавиться от них, они должны быть выполнены. Вопрос в том, когда они необходимы? Поэтому, возможно, вы можете поместить их в какую-либо фазу инициализации или в другой поток, который будет вычислять результаты для вас, в то время как ваш графический интерфейс доступен для ваших пользователей.

В одном из моих приложений я делаю большой запрос к SQL Server. Эта задача занимает некоторое время (созданное соединение, отправка запроса, ожидание результата, помещение результата в таблицу данных, внесение некоторых расчетов самостоятельно, представление результатов пользователю). Все эти шаги необходимы и не могут быть быстрее. Но они будут выполняться в другом потоке, пока пользователь видит в окне результатов «Подождите» с индикатором выполнения. Тем временем пользователь уже может сделать некоторые другие настройки в пользовательском интерфейсе (если он любит). Таким образом, пользовательский интерфейс является отзывчивым, и у пользователя нет большой проблемы, чтобы подождать несколько секунд.

Так что это не реальный ответ, но, возможно, он дает вам несколько идей о том, как решить вашу проблему.

0

Вы можете разделить нагрузку на пару рабочих потоков, скажем, 3 потока, каждый из которых имеет дело с 1000 элементами. Вы можете синхронизировать его с AutoResetEvent

+0

. Это приведет к ускорению только в многоядерных системах. – chriszero

+0

Да, и даже с multicores это не принесет вам много пользы в загруженной среде веб-сервера. .NET 4.0 'Parallel.For' имеет гораздо меньше накладных расходов, и будет намного лучше выбирать. – Steven

+0

Но .NET 4.0 все еще находится в стадии бета-тестирования. –

0

Некоторые предложения, хотя я думаю, что большая часть работы в TristripToGraphicsPath():

// Use rectTristrip.Strip.Length instead of NoOfStrips 
    // to let the JIT eliminate bounds checking 
    // .Count if it is a list instead of array 
    for (int i = 0; i < rectTristrip.Strip.Length; i++) 
    { 
     VertexList verList = rectTristrip.Strip[i]; // Removed 'new' 
     GraphicsPath rectPath4 = verList.TristripToGraphicsPath(); 

     // Assuming pointList is infact a list, do this: 
     pointList.AddRange(rectPath4.PathPoints); 
     // Else do this: 

     // Use PathPoints.Length instead of PointCount 
     // to let the JIT eliminate bounds checking 
     for (int j = 0; j < rectPath4.PathPoints.Length; j++) 
     { 
      pointList.Add(rectPath4.PathPoints[j]); 
     } 
    } 
0

А может быть verList = rectTristrip.Strip [я]; // Удалено 'VertexList' для сохранения некоторой памяти Определить переменную VertexList verList над циклом.

+0

Это не сохраняет вас в памяти, если VertexList не является типом значений, что я сомневаюсь. –

+0

Да, вы правы. – raf

Смежные вопросы