Есть ли оптимизация при конкатенации строк?

Страницы: 1
RSS
Есть ли оптимизация при конкатенации строк?
 
Кто-нибудь знает, при нескольких конкатенациях:
Код
str1 = 'b'
str = str .. 'a' .. str1 .. str1
str будет 3 раза удаляться и пересоздаваться, или будет какая-то оптимизация этого присваивания?
 
Похоже, что есть: у lua_concat параметр - количество строк для конкатенации.
Ну и кусок из исходников:
Код
/*
** Create code for '(e1 .. e2)'.
** For '(e1 .. e2.1 .. e2.2)' (which is '(e1 .. (e2.1 .. e2.2))',
** because concatenation is right associative), merge both CONCATs.
*/
static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) {
  Instruction *ie2 = previousinstruction(fs);
  if (GET_OPCODE(*ie2) == OP_CONCAT) {  /* is 'e2' a concatenation? */
    int n = GETARG_B(*ie2);  /* # of elements concatenated in 'e2' */
    lua_assert(e1->u.info + 1 == GETARG_A(*ie2));
    freeexp(fs, e2);
    SETARG_A(*ie2, e1->u.info);  /* correct first element ('e1') */
    SETARG_B(*ie2, n + 1);  /* will concatenate one more element */
  }
  else {  /* 'e2' is not a concatenation */
    luaK_codeABC(fs, OP_CONCAT, e1->u.info, 2, 0);  /* new concat opcode */
    freeexp(fs, e2);
    luaK_fixline(fs, line);
  }
}

 
Ничего не понятно, но всё так, как надо.  :smile:

Где-то в Интернете есть онлайн сервисы, на которых вводишь код на разных языках и смотришь скомпилированный код. Возможно, так можно увидеть через байт-код Луа, как фрагменты компилируются.

А я вчера много времени потратил на выяснение: будет ли ускорение от такой оптимизации в OnAllTrade и в OnQuote, где вычисляется символьное время сделки/изменения в стакане для вывода типа
Код
UWGN 18:49:59.388251 47.4 482 S
IRKT 18:48:33.469798 bids=20 85.45/1806 85.40/56 85.35/6 85.20/163 85.15/4 85.05/12 85.00/36 84.90/28 84.85/11 84.80/3 84.60/2 84.50/99 84.40/3 84.30/2 84.25/6 84.20/10 84.15/7 84.10/43 84.05/129 84.00/482 offers=3 85.20/15 85.40/13 85.45/512
Часы и минуты меняются редко, цена и количество акций в стакане по нелучшим ценам тоже: что, если запоминать эти значения в строках, и если они не изменились, вставлять закэшированные?
Мерял время выполнения этих коллбэков через os.sysdate().mcs, получал 0. Снизил частоту ЦП до 800 МГц, внутри коллбэка сделал цикл на 10 повторов, опять 0. Как-то не верится в такое: слишком быстро. А если повтор цикла увеличить, то выскакивают цифры ~ 5000 мкс, 10000, 15500. Про 15500 я знаю, что это квант времени для работы потока. Поэтому я так и не понял, есть ли от этого ускорение. Ведь в этом случае этой оптимизации придётся делать проверки, что время не поменялось, запоминать новое время, конкатенировать строки... В общем, НИР/ОКР ерундой прозанимался... :what:
Страницы: 1
Читают тему
Наверх