Оптимизация кода

 
Для начала пара вопросов, скорее всего разработчикам.

1) Как работает ArrayResize - выделяется память именно сколько запрашивается, или с запасом, чтобы при следующем выполнении не отрабатывалась дорогая операция allocate memory. Так делается в библиотеках C/C++.
Мне надо выполнять ArrayResize при каждом добавлении сигнала.

2) В доке сказано, что время выполнения deinit в эксперте ограничено 2.5 сек. Реально время таково? Обойти это никак? Как проверить в коде при следующем init, что deinit был прерван по таймауту?

3) Как при тестировании замерить время выполнения участка кода? Я не нашёл ни одной функции, выдающей текущее время в момент выполнения функции, а не время запуска эксперта или эмуляция времени тика.
 
Dali >>:
Для начала пара вопросов, скорее всего разработчикам.
Я не разработчик, но...
1) Как работает ArrayResize - выделяется память именно сколько запрашивается, или с запасом, чтобы при следующем выполнении не отрабатывалась дорогая операция allocate memory. Так делается в библиотеках C/C++.
Мне надо выполнять ArrayResize при каждом добавлении сигнала.
КАК это устроено - сказать точно не могу, но это реально затратная по времени операция. Так что похоже, что делается так, как вы предположили.
2) В доке сказано, что время выполнения deinit в эксперте ограничено 2.5 сек. Реально время таково? Обойти это никак? Как проверить в коде при следующем init, что deinit был прерван по таймауту?
Через GV? Ну, например, в конце deinit выставляете флаг в GV.
3) Как при тестировании замерить время выполнения участка кода? Я не нашёл ни одной функции, выдающей текущее время в момент выполнения функции, а не время запуска эксперта или эмуляция времени тика.
GetTickCount( ) никак не подходит?
 

2) зациклить скрипт или советник и потом грохнуть его вручную и посмотреть причину деинициализации

 
По 3 вопросу . А как Вы это сделали бы в С++. Точно также и здесь.
По поводу GetTickCount( ) эта функция считает по 1мс,но надо не забывать, что время тактирования от 10 до 30 мс. Поэтому время выполнения коротких программ им замерять нельзя.
Для более точного замера я использовал QueryPerformanceFrequency и её пару QueryPerformanceCounter,засечь можно единицы тактов процессора. Лучшего нет.
 
1) Замерил пару ArrayResize (одномерный + двумерный 128 столбцов), при последовательном добавлении по 1 строке время плавно растёт с 0 мс до 7 мс на 3000й строке. При выделении сразу по 4000 строк время 6 мс. Похоже разработчики не реализовали стандартный сишный ход с выделением памяти блочно с запасом. Придётся самому.

2) Зацикленный код в deinit не прерывается по таймауту ни при тестировании, ни при оптимизации. Висит, пока не нажмёшь Stop. Меня это устраивает.
UnitializeReason в последующем init не возвращает ничего кроме 0.
GV - хорошая идея, спасибо. Она бы пригодилась, если бы срабатывал таймаут.

3) GetTickCount( ) прекрасно подходит, спасибо (надо бы её добавить в раздел функций времени, там ей место). Точнее мне не надо.

PS: терминал запускается в wine (linux), возможно в этом причина недокументированного поведения. Кто-нибудь бы проверил в винде
int start = GetTickCount();
n = 0;
while (n == 0)
PrintDebug(0, "deinit (ms) = " + (GetTickCount() - start));
Сразу будет видно время таймаута (если есть).

И выдаёт ли UnitializeReason код ошибки при последующем init (какие по таймауту и по кнопке Stop).