vim-jp/issues — Issue #123: スクリプトの行連結を高速化できないか
Author: koron
Created: 2012-01-12 00:41:45+00:00
State: open
Labels: discuss, performance

Vimスクリプトでは行頭の ```\``` で行の連結ができますが、これが多い場合にスクリプトの読み込みに時間がかかることが知られています。これを解決できないかと考えています。

遅くなっている原因はex_cmd2.cのgetsourceline()とget_one_sourceline()によりますが、特に行連結に限ればgetsourceline()だけ考えれば良いでしょう。問題のコードはこんな感じです。

> for (;;)
> {
> sp->nextline = get_one_sourceline(sp);
> if (sp->nextline == NULL)
>	break;
> p = skipwhite(sp->nextline);
> if (*p != '\\')
>	break;
> s = alloc((unsigned)(STRLEN(line) + STRLEN(p)));
> if (s == NULL)	/* out of memory */
>	break;
> STRCPY(s, line);
> STRCAT(s, p + 1);
> vim_free(line);
> line = s;
> vim_free(sp->nextline);
> }

要点を整理すると

* 行連結を見つけた際に前後の行をひとつのバッファに合成する/strlenとallocとstrcpy/catが発生する
* 行連結が連続すると上記操作が無駄に繰り返される/同じ行の内容を何度もコピーする

という構造です。経験上、特にstrlenとstrcpy/catが痛いかも。