【发布时间】:2012-11-25 15:09:32
【问题描述】:
在我的代码中有一些情况,我正在构建大量文本字符串,例如复杂的 SQL 语句。我打算将这段文字连续多次放在一起,每次都有一些略有不同的参数。我已经养成使用一个名为 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');
【问题讨论】:
-
为什么不在调试器中打开它并查看生成的 ASM?
-
如果您要将该文本作为 SQL 查询发送,那么 db 查询将花费比创建查询字符串的代码多几个数量级的时间。
-
只是好奇:你为什么使用#10#13 (LF CR) 而不是#13#10 (CR LF)?
-
使用 sLineBreak 并且不必记住哪个是第一个..
-
>>“那个 SQL 查询只是真实场景的一个快速示例。”在这种情况下,我想更清楚地说明这里提到的内容。请考虑一下 Knuth:“程序员会浪费大量时间来思考或担心程序中非关键部分的速度,而在考虑调试和维护时,这些效率上的尝试实际上会产生强烈的负面影响。我们应该忘记小的效率低下,大约 97% 的时间说:过早的优化是万恶之源。但我们不应该在关键的 3% 中放弃我们的机会。”
标签: string delphi delphi-xe2 concatenation compiler-optimization