@DavidThielen, какая версия .Net эта сборка на 4.5 или раньше?

есть программа сравнения для нашей системы отчетности, которая генерирует конкретный отчет 2000 раз.

Мы постарались сократить это время до нашего движка так:

Шаблон считывается с диска один раз в память, затем эта копия в памяти передается в движок.Файловые источники данных (XML, JSON) также считываются в память один раз, а затем этот кэшированный источник данных используется повторно.База данных SQL - это SqlServer на том же компьютере. Так что есть ввод / вывод, но он должен быть быстрым.Источник данных OData находится на другом сервере, поэтому он имеет операции ввода-вывода, которые могут занять некоторое время.

Теперь вот где это становится интересным. Наш движок написан на Java, и мы используем IKVM для создания его версии .NET. IKVM создает библиотеки DLL, которые являются истинными байтовыми кодами .NET. Как будто мы написали один и тот же код на C #. Так что в принципе у нас есть один и тот же код на Java & C #.

А код JSON (JPath) Java на 100% является кодом .NET JSON через IKVM. Код Java (XPath) на 98% одинаков на стороне .NET. Код Sql отдельно от класса для соединителя (JDBC и ADO.NET), но все, что находится за пределами этих соединителей, идентично. То же самое для OData.

Таким образом, чтобы подвести итог, тот же код и для XML / JSON полностью привязан к процессору, в то время как Sql немного привязан к вводу / выводу и OData немного больше привязан к вводу / выводу.

Вот результаты под Java. Практически 50% -ное увеличение общего объема производства (каждый отчет генерируется в одном потоке, это общее количество страниц во всех отчетах во всех измеряемых потоках) для удвоения количества потоков.

Это 4-ядерная система, которая с гиперпоточностью выглядит как 8 ядер для программы.

Вывод движка Java (страниц в секунду)

Но в .NET не так, как ожидалось. Небольшое улучшение XML и JSON из 2 - 4 потоков и ничего после этого. Sql достойное улучшение из 2 - 4 потоков и снова ничего после этого. Только OData показывает ожидаемое улучшение:

Наш код для запуска этого в нескольких потоках:

ReportWorker[] workers = new ReportWorker[numThreads];
for (int ind = 0; ind < numThreads; ind++)
    workers[ind] = new ReportWorker(ind, new CommandLine(cmdLine));
System.Threading.Thread[] threads = new System.Threading.Thread[numThreads];
for (int ind = 0; ind < numThreads; ind++)
    threads[ind] = new System.Threading.Thread(workers[ind].DoWork);
for (int ind = 0; ind < numThreads; ind++)
    threads[ind].Name = "Report Worker " + ind;

for (int ind = 0; ind < numThreads; ind++)
    threads[ind].Start();

// we wait
for (int ind = 0; ind < numThreads; ind++)
    threads[ind].Join();

Когда я работаю в 4-х потоках, все 8 процессоров (с помощью монитора производительности Windows) находятся между 50% и 80%. При запуске 8 потоков все 8 процессоров работают на 80% - 95%.

Есть ли в приведенном выше поточном коде что-то, что могло бы вызвать эти результаты? Это приложение командной строки - есть ли причина, по которой оно может не запускать потоки одновременно?

Любые предложения о том, что изменить или исследовать, приветствуются.

Ответы на вопрос(0)

Ваш ответ на вопрос