Поток внутри цикла для улучшения производительности - PullRequest
2 голосов
/ 19 января 2012
foreach (int tranQuote in transactionIds)
            {
                CompassIntegration compass = new CompassIntegration();
                Chatham.Business.Objects.Transaction tran = compass.GetTransaction(tranQuote);

                // then we want to send each trade through the PandaIntegration
                // class with either buildSchedule, fillRates, calcPayments or
                // a subset of the three
                PandaIntegrationOperationsWrapper wrapper = new PandaIntegrationOperationsWrapper { buildSchedule = false, calcPayments = true, fillRates = true };
                new PandaIntegration().RecalculateSchedule(tran, wrapper);

                // then we call to save the transaction through the BO
                compass.SaveTransaction(tran);
            }

Две строки здесь занимают очень много времени.В transactionIds есть около 18 тыс. Записей, для которых я делаю это.

GetTransaction и SaveTransaction - это две строки, которые занимают больше всего времени, но я, честно говоря, просто хотел бы прояснить, что происходитвнутри цикла для повышения производительности.

Каков наилучший способ решить эту проблему, не сталкиваясь с какими-либо проблемами с процессором или чем-то подобным?Я не совсем уверен, сколько потоков безопасно, как управлять потоками или тому подобное.

Спасибо, ребята.

Ответы [ 3 ]

3 голосов
/ 19 января 2012

TPL обеспечит необходимое регулирование и управление.

//foreach (int tranQuote in transactionIds) { ... }
Parallel.ForEach(transactionIds, tranQuote => { ... } );

Требуется Fx4 или более поздняя версия, и весь код внутри цикла должен быть поточно-ориентированным.
Неясно, безопасны ли одновременные вызовы GetTransaction и SaveTransaction.

3 голосов
/ 19 января 2012

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

1 голос
/ 19 января 2012

Вы можете использовать параллельный foreach, если порядок не имеет значения для улучшения общей производительности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...