4

在我的代码中有一些情况,我正在构建大量文本字符串,例如复杂的 SQL 语句。我打算将这段文字连续多次放在一起,每次都有一些略有不同的参数。我已经养成使用名为 just 的子程序的习惯,procedure A(const S: String);它只是将文本 ( S) 附加到较大的字符串Text := 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

请注意,当使用非常量表达式时,将所有连接放在一个表达式中仍然更有效。考虑这段代码:

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

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

上面的六个语句将执行 5 个单独的连接。然而:

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

将执行单个连接。Delphi 将为结果分配必要的空间并将六个值中的每一个复制到该空间中。

于 2012-11-26T09:41:47.073 回答