2015-05-22 2 views
2

Я использую graphicmagick.exe (командный инструмент) для преобразования файла из одного формата в другой формат: в этом я использовал для передачи входного пути и пути вывода для преобразования как рычаги. Теперь я перебираю каталог, используя foreach, и передаю входной файл один за другим и конвертируя в другой формат.Лучший способ получить доступ к файлам изображений для повышения производительности

Но это влияет на производительность. Есть ли лучший способ повысить производительность? Пожалуйста, предложите мне.

+1

Сначала используйте профилировщик производительности, что _actually_ медленно. Мое предположение о узких местах было практически всегда ложным. Такой инструмент, как [ANTS Performance Profiler] (http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/), покажет, что ваш ват на самом деле медленный. –

+0

, если инструмент graphicmagick может быть выполнен как несколько экземпляров, вы можете использовать потоки внутри цикла for для одновременного выполнения, не влияя на производительность вашего приложения. Единственное примечание здесь: вы должны ждать, пока все файлы будут обработаны в конце. –

+0

Кроме того, я бы _expect_ вызывал внешний процесс из вашего кода, чтобы быть медленным. Знаете ли вы, что [GraphicsMagic предоставляет API-интерфейс .NET-оболочки] (https://graphicsmagick.codeplex.com/)? –

ответ

1

Использовать параллельный класс (ForEach или For).

Parallel.ForEach(files, file => 
{ 
    // do something with file 
    ... 
}); 

В этом случае будут загружены все процессорные ядра. В противном случае только один. Но помните, что код внутри Параллельные блоки должны быть потокобезопасными и не блокировать друг друга.

+0

ОК, кто-то был быстрее меня :) – Fritz

1

Проверить http://www.graphicsmagick.org/FAQ.html#how-can-i-process-many-files-at-once

Я думаю, что ваш код выполняет приложение на каждом для. Так что это очень дорого. Приложение имеет опции для множественной обработки файлов. Сначала проверьте, что вместо кода, выполняющего приложение, для каждого файла. Различие заключается в том, чтобы запустить один процесс и применить изменения на изображении, чем запуск одного процесса на файл.

Если вам все еще нужно выполнить на C#, измените свой код на использование Parallel.Foreach вместо foreach и проверьте, есть ли выигрыш в выполнении. Попробуйте с образцом, возможно, 50-100 файлов в каталоге и проверьте время выполнения между обеими реализациями.

Поздравления и удачи!

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