#c# #asp.net-core #.net-core #imageprocessor
#c# #asp.net-core #.net-ядро #imageprocessor
Вопрос:
В настоящее время я изучаю ImageProcessorCore и столкнулся с проблемой, из-за которой мне кажется, что я что-то упускаю: на своем веб-сайте разработчик показывает некоторые тесты с производительностью, которая полностью отличается от времени, которое я измеряю в моем примере программы. У меня есть изображение размером 2,3 МБ (3853×2569) в формате jpg, из которого я хочу получить только ширину и высоту (на данный момент), поэтому я создал это немного.Тестовое приложение NET core console:
using ImageProcessorCore;
using System;
using System.IO;
namespace ImageProcessorCoreTest
{
public class Program
{
public static void Main(string[] args)
{
using (FileStream input = File.OpenRead(@"c:testa.jpg"))
{
DateTime start = DateTime.Now;
Image image = new Image(input);
int w = image.Width;
int h = image.Height;
double duration = (DateTime.Now.Subtract(start)).TotalMilliseconds;
Console.WriteLine("Image size is " w.ToString() "x" h.ToString() " Pixels (" duration.ToString() "ms)");
Console.ReadLine();
}
}
}
}
Эта операция занимает более 11 секунд (коэффициент 100 по сравнению с контрольными показателями, упомянутыми выше), чтобы просто прочитать изображение и получить размер. Что я делаю не так?
Я использую версию 1.0.0 в Windows 10 Pro 64.
(Кстати: моя машина для разработки — это i7-5820K с 16 ГБ оперативной памяти и накопителем Samsung Pro 950 NVMe, поэтому, я думаю, аппаратное обеспечение, скорее всего, не может быть узким местом.)
Обновление 1: Перекомпиляция ImageProcessorCore и создание пакета release nuget, который я затем использую в своей (release) примерной программе, к сожалению, сокращает продолжительность до чуть более 10 секунд.
Обновление 2: я только что изменил размер тестового изображения (внешнего) до 2000×1334 пикселей. Это значительно сократило время до 849 миллисекунд, что все еще странно, учитывая заданные 56 мс для чтения, изменения размера и повторной записи в тесте разработчика.
Обновление 3: теперь я использую тестовое изображение, которым я могу поделиться с вами для тестирования. Новое изображение имеет размер 11416×6380 пикселей (11,5 МБ) и занимает> 17 секунд с приведенным выше кодом. Вы можете скачать его здесь: http://orig01.deviantart.net/92d3/f/2010/110/7/2/pla_sf_3_by_recon071.jpg
Обновление 4: когда я использую пакет из репозитория MyGet, время для последнего тестового изображения (см. Обновление 3) уменьшается до 2,4 секунды.
Комментарии:
1. насколько велик ваш тестовый образ?
2. Я попробовал ваш код для этого файла jpg размером ~ 11,5 МБ. Я использовал ImageProcessorCore версии 1.0.0-alpha1058, доступный на myget . На моей машине установлен процессор i5-6200U с частотой 2,30 ГГц, 8 ГБ оперативной памяти, дисковод Travelstar Z5K1000, работает 64-разрядная версия Windows 10 Pro . Хотя размер тестового изображения намного больше вашего, в среднем это занимает 5 секунд. Можете ли вы поделиться своим тестовым изображением?
3.Согласно истории пакетов ImageProcessorCore на myget, последний выпуск был опубликован во вторник, 27 сентября 2016 года. Однако ваша версия опубликована 30 сентября 2016 года. Вы собрали это из какого-то другого источника? Подумайте о том, чтобы поделиться этим.
4. Извините, дата публикации, конечно, вводит в заблуждение, потому что я сам скомпилировал пакет и добавил его в свой локальный репозиторий, так что неважно. Я отредактировал свой пост. Я добавил еще одно изображение, которым могу поделиться с вами для тестирования. Я также попробую ваше изображение сейчас и дам вам знать, что я получу.
5. @f.nasim: для завершения вашего изображения требуется около 17,2 секунды. Действительно странно…
Ответ №1:
Вы получаете правильную производительность с официальной сборкой, но не с вашей собственной, очевидно, означает, что что-то не так с вашими параметрами сборки. Как и вы, я клонировал ImageProcessorCore и создал свой собственный пакет. Неудивительно, что я также получал низкую производительность, как и вы! Для вашего 12,1 МБ test.jpg заняло ~ 23 секунды (в то время как при официальной сборке это занимает ~ 3 секунды).
Проблема на самом деле связана с командой сборки. По умолчанию .Команда NET Core package ( dotnet pack
) создает пакет в Debug
конфигурации. А отладочная сборка имеет более низкую производительность, поскольку выполняет сложное хранение символов и другие вспомогательные операции.
Я создал пакет в Release
конфигурации с помощью следующей команды:
dotnet pack --configuration Release
На этот раз производительность точно идентична официальной сборке (~ 3 секунды для test.jpg !)
Комментарии:
1. Хорошее место! Если у вас есть ImageProcessorCore в качестве другого проекта в решении (вместо того, чтобы использовать его как внешнюю ссылочную dll, которая была собрана в другом месте), и вы создаете решение в режиме выпуска, имеет ли это тот же эффект?
2. Хотя я и не пробовал, но все дело в конфигурации, которую механизм сборки использует для сборки исходных текстов. В настоящее время ImageProcessorCore построен с использованием движка сборки .NET Core и предназначен для среды выполнения .NET Core . Если вы добавите его в Visual Studio, он изменится на MSBuild и .NET Framework соответственно. Оба движка сборки имеют
Debug
иRelease
конфигурации. Однако в обоих случаях можно с уверенностью сказатьRelease
, что сборка будет работать лучше.3. Я думаю, что 3 секунды — это все, что мы получаем на данный момент, в конце концов, это все еще альфа-программное обеспечение, и «повышение производительности» — одна из тем в дорожной карте разработчика, поэтому я хотел бы поблагодарить его за отличную работу до сих пор. Я не уверен, достаточно ли у меня опыта, чтобы самостоятельно настроить код, но я обязательно попробую это сейчас.
4. Производительность определенно находится на повестке дня и сейчас находится в центре нашего внимания. Скоро произойдет много хорошего, что должно улучшить ситуацию.