C_Sharp 板


LINE

C#的string比起C或是C++方便很多, 但是操作简单的背後隐藏着效能陷阱, 比如我在初学的时候就经常使用这样的做法: string s; for (int i = 0; i < 10; i++) s += i.ToString(); 语法上可以过,也非常直觉, 但後来经过前辈的提点,这样的做法会造成每次回圈s都重复拆箱装箱, 等於是每次都是new一个新的string出来, 其实是相当浪费效能的,能避就避,建议使用StringBuilder 现在有一个case是这样的, float x, y; string str = ((int)(x / (x + y) * 100)).ToString() + "%"; 简单说就是一个显示x百分比的算式, 按照上面的拆箱装箱的逻辑,这一行算式会进行两次装箱运算, 首先将(int)(x / (x + y) * 100)装成一个string, 接着再把这个string加"%",装成要求的str。 这行算式是否可以写成 string str = ((int)(x / (x + y) * 100)) + "%"; 就是很单纯的没有加上.ToString() 前面的数字会被隐含转换成string, 依然可以做成要求的数字,这样写法的装箱次数又是几次? --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.169.41.67
1F:→ fireslayer:这两行一模一样 03/16 16:00
2F:→ ssccg:隐含转换成string就是等於呼叫ToString 03/16 16:13
3F:→ ssccg:说拆箱装箱其实不太对,string是reference type,不是value 03/16 16:20
4F:→ ssccg:type,必须每次都产生新的是因为immutable 03/16 16:21
了解,所以没办法在一行code 仅一次装箱完成这句算式罗? ※ 编辑: stu87616 来自: 1.169.41.67 (03/16 16:28)
5F:→ ssccg:只要不是(可能)次数很大的回圈,不用去担心这点 03/16 16:30
6F:→ ssccg:C#语言设计成这样就是这样用的 03/16 16:30
7F:→ erspicu:如果对程式执行感受毫无影响或是影响轻微可忽略 其实 03/16 17:55
8F:→ erspicu:根本不需要在这种节骨眼上浪费时间进行这种小优化 03/16 17:55
9F:→ andymai:仔细想想~你要的数字字串都是不一样的~从最根本看来~并没 03/16 20:42
10F:→ andymai:有办法解决new string不是吗?除非能再想到另一种方法组出 03/16 20:43
11F:→ andymai:你要的数字字串~但效能会好上多少~是否值得也是问题... 03/16 20:44
12F:→ songting:如果你是一次要转档上万笔资料 用tostring的确不太好 03/16 21:47
我想到因为百分比一定在0~100%之间, 而我这个case又刚好只要整数, 所以可以先做一个string[101]把所有的资料都存好, 然後根据数值引用阵列,这样值不值得呢~? 我也知道这种小细节不必太计较, 就算是上万笔的资料,也顶多就是几秒或几十秒的差别罢了, 只是我就是想知道有没有存在最佳的做法 ※ 编辑: stu87616 来自: 1.169.41.67 (03/16 23:50)
13F:→ andymai:就算可以~这种做法也是用"空间"换取时间~若是大型程式~又 03/17 06:22
14F:→ andymai:要考虑是否空间够用~以及是否一直存在~还是会消失~如果这 03/17 06:24
15F:→ andymai:个案例不是单纯101个短字串~那又可能会造成空间拖到时间XD 03/17 06:25
16F:→ erspicu:你可以用stopwatch做BENCHMARK测试 以10万比来说 03/17 09:01
17F:→ erspicu:我猜两者差异是0.X秒的等级 03/17 09:18
18F:→ erspicu:如果你的编译器选项有开优化 差异应该会更小 03/17 09:19
19F:→ erspicu:实际上如果对这块领域有兴趣 应该要学clr中介码 03/17 09:45
20F:→ erspicu:把程式反组译後看看编译器实际生成内码为何 03/17 09:46
21F:→ erspicu:否则很容易沦为空想和猜测 一些以为更快的非通例做法结果 03/17 09:47
22F:→ erspicu:到头来甚至有可能会更慢 03/17 09:47
23F:→ ssccg:小整数我想.NET本来就有作优化,不用你自己作 03/17 14:32







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP