为祖国健康工作50年

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  41 随笔 :: 0 文章 :: 383 评论 :: 32万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

今天看到一篇文章,是关于在.NET中如何提升程序性能的,里面有这样一条:

建议使用+=、-= 等简化操作符
例如原有表达式 A=A+B
改为A+=B
这样不仅减少了敲入代码的数量,而且由于变量A只出现一次,在运行时也提高了系统的性能。

确实这样的操作能减少输入,但是对于是否真能提高性能,以及以什么方式来提高性能(是优化了代码还是节省了空间等),确实不太知道,带着好奇心,自己动手试试了。首先写了两个测试方法:

复制代码
static void test1()

{
string A = "string A"
;
string B = "string B"
;
A
+=
B;
}

static void
test2()
{
string A = "string A"
;
string B = "string B"
;
A
= A +
B;
}
复制代码

编译后用ildasm查看两者的IL,可以看出,两个方法的IL是一致的:

复制代码
.maxstack 2
.locals init ([0] string
A,
[
1] string
B)
IL_0000: nop

IL_0001: ldstr "string A"

IL_0006: stloc.0

IL_0007: ldstr "string B"

IL_000c: stloc.1

IL_000d: ldloc.0

IL_000e: ldloc.1

IL_000f: call string [mscorlib]System.String::Concat(string
,
string
)
IL_0014: stloc.0

IL_0015: ret

复制代码

既然IL都是完全一样的,想必用reflector反编译后的代码也是一样的喽。

这里分别按优化级别来查看:

复制代码
//优化级别为NONE

private static void test1()//或者test2
{
string
A;
string
B;
A
= "string A"
;
B
= "string B"
;
A
= A +
B;
return
;
}
//优化级别为.NET 3.5private static void test1()()//或者test2

{
string A = "string A"
;
string B = "string B"
;
A
= A +
B;
}
复制代码

(这里看出的代码不同是CLR平台对于我所写的代码的优化,而不是关于我们讨论的+=是否优化,别混淆)
由此看来,无论从哪个角度来看,所谓的提高性能是子虚乌有的,仅仅是.NET提供的一个语法糖,简化操作,并无特别的处理。

确实有点小题大做,但至少可以说明在学习过程中,不仅需要多看文章,同时也要能独立的思考,能够动手去验证一个别人的观点也是一种好的习惯。就比如现在有许多关于“优化”方面的建议,当然大部分都是正确的(肯定不是靠感觉出来的,尤其是对于优化方面,经常需要被量化出来才能确定的),然而也是需要条件的,就比如对于string和stringbuilder的讨论,似乎没有人说过以后不要用string之类的话吧;还有一部分,需要在以后的学习实践中,等到有能力的时候,去试试验证一下。

注:网上也找了一些这方面的文章,似乎在java中,两者确实有区别,这不在本文讨论中,但也希望哪个好心人可以帮忙验证一下,多谢!

posted on   lerit  阅读(8422)  评论(33编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示