Что с нагрузкой ?

 

скрипт MT5, много-много вычисляет больше 5-ти минут..

просто математика, можно сказать арифметика.
По подготовленным в памяти массивам, без обращений к истории, чарту и торговле

но что-то странное :


почему нет нагруженного ядра ? активные вычисления в цикле по идее должны были нагрузить одно ядро. А пики на скриншоте, они в основном от самого скриншота и броузера. 

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

 

есть мысль, что внезапно виноват IsStopped(); Вложенные циклы, долгие вычисления и он там часто насажен (чтобы принудительная выгрузка работала без нареканий и задержек). 
если у IsStopped() внутри есть yield , то он переключает контексты и будет именно такая картина как наблюдается.

Подтвердите, тогда надо будет как-то прореживать обращения к нему. 

 
Maxim Kuznetsov:

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

Ответ не полный, о частности, но...

ОС не нагружает одно ядро. Даже одна активная задача распределяется на разные ядра. Не смотрите графики нагрузки по отдельным ядрам.

 
Edgar Akhmadeev:

Ответ не полный, о частности, но...

ОС не нагружает одно ядро. Даже одна активная задача распределяется на разные ядра. Не смотрите графики нагрузки по отдельным ядрам.

нить не должна так часто мигрировать и простаивать, да ещё и видимо с дегрейтом приоритета. 

сплошные вычисления везде и всегда нагружают проц. Иначе зачем он нужен, он для этого сделан, вычисления вычислять.

 
Возможно потоки распределены на разные ядра процессора.
 
Maxim Kuznetsov:

скрипт MT5, много-много вычисляет больше 5-ти минут..

просто математика, можно сказать арифметика.
По подготовленным в памяти массивам, без обращений к истории, чарту и торговле

но что-то странное :


почему нет нагруженного ядра ? активные вычисления в цикле по идее должны были нагрузить одно ядро. А пики на скриншоте, они в основном от самого скриншота и броузера. 

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

Операционка может перебрасывать нагрузку с одного ядра на другое. Смотрите общую загрузку, должно находится около 1/16, то есть 6% плюс другие процессы

 
Может массивы плохо ложатся на кэш проца и идет постоянное обращение к озу?
 

субъективно (без замеров, возможен эффект наблюдателя и выдавание ожидаемого за действительное)

но IsStopped() способствует миграции с ядра на ядро..

вот так получается когда он в меру прорежен


всё менее хаотичное и прямо видно.

если совсем убрать, то полосочки/столбики становятся шире (мигрируют реже). Но это неюзабельно, так скрипт не снять, а он считаться может несколько часов

 
Maxim Kuznetsov:

тогда надо будет как-то прореживать обращения к нему. 

ну уберите проверку IsStopped() в условии цикла, проверяйте по любому счетчику, примерно так:

if(++cnt % 1000 == 0)
{
  if(IsStopped()) break; // или return;
}
 
Igor Makanu:

ну уберите проверку IsStopped() в условии цикла, проверяйте по любому счетчику, примерно так:

так и делал. Последний скриншот именно с подобным прореживанием

 

а вот вообще без IsStopped 


практически оседлалось одно ядро и миграции редки.

кстати даже промежуточная печать (вывод в журнал "я жив, готово 17%") тоже вызывает переключения и миграции. Но там-то понятно отчего и можно объяснить