4

複雑な SQL ステートメントなど、大量のテキスト文字列を作成するコードのケースがいくつかあります。私は、このテキストを何回も続けてまとめようと思っています。私は、より大きな文字列にprocedure A(const S: String);テキスト ( ) を単純に追加する、 just という名前のサブルーチンを使用する習慣を身につけました。SText := Text + S + #10 + #13;

従来の文字列連結を使用するのとは対照的に、これがパフォーマンスを妨げる可能性があるかどうか疑問に思っていましたか? 私は、コンパイラが次のようなものを最適化すると考え始めています:

Text := 'some' + ' ' + 'text' + ' ' + 'and' + ' ' + 'such';

Text := 'some text and such';

これは本当ですか?コンパイラはこのシナリオを最適化しますか? もしそうなら、私はすべてを次のように変更することにするかもしれません:

Text := 'select something from sometable st'+#10+#13+
  'join someothertable sot on sot.id = st.sotid'+#10+#13+
  'where sot.somevalue = 1'+#10+#13+
  'order by sot.sorting';

これは理論的にはより高速ですか?

Text:= Text + 'select something from sometable st'+#10+#13;
Text:= Text + 'join someothertable sot on sot.id = st.sotid'+#10+#13;
Text:= Text + 'where sot.somevalue = 1'+#10+#13;
Text:= Text + 'order by sot.sorting';

または私が通常それを行う方法:

A('select something from sometable st');
A('join someothertable sot on sot.id = st.sotid');
A('where sot.somevalue = 1');
A('order by sot.sorting');
4

2 に答える 2

9

みたいな表現

'a' + 'b'

コンパイル時に評価されます。つまり、割り当て

str := 'a' + 'b';

と同じコンパイル済みコードになります

str := 'ab';

一方、

str := 'a';
str := str + 'b';

連結は実行時に実行されます。

于 2012-11-25T15:15:55.757 に答える
0

非定数式が使用されている場合は、すべての連結を 1 つの式に入れる方がさらに効率的であることに注意してください。次のコードを検討してください。

  A := '*';
  B := 'person';
  C := 'first_name=''Jerry''';

  Q := 'select ';
  Q := Q + A;
  Q := Q + ' from ';
  Q := Q + B;
  Q := Q + ' where ';
  Q := Q + C;

上記の 6 つのステートメントは、5 つの個別の連結を実行します。一方:

  Q := 'select ' + A + ' from ' + B + ' where ' + C;

単一の連結を実行します。Delphi は結果に必要なスペースを割り当て、6 つの値のそれぞれをそのスペースにコピーします。

于 2012-11-26T09:41:47.073 に答える