作者dcam (DigiCam)
看板Programming
标题Re: [问题] 外国高级工程师的面试题
时间Tue Nov 17 23:18:49 2009
: ※ 引述《zuki326 (Zukisa)》之铭言:
: : 这里有一份外国公司的高级工程师面试题
: : 不知道有没有人可以答得出来
: : 1. Explain in detail what is wrong with the following code-block
: : and provide a correct implementation:
: : 解释以下程式码有何错误,并提供正确的写法
: : private string GetString()
: : {
: : string value = string.Empty;
: : for (int i = 0; i < 85000; i++)
: : value += i.ToString();
: : return value;
: : }
: 因为String 在语言设计上通常都是 immutable 的,所以String + operator
: 每次操作都得产生新的String才行,而上面的程式里每次for loop产生出来的
: 新String除了给下次用以外没有其他用途。这是一种可怕的浪费。
: 我想到的解法是给new char[85000] ,塞数字,然後语言本身一定有方法可以
: 直接转String。
你只要产生一个 string object, 用他来做 num->str 的转换, 然後 append
to result string 即可避免过多的 temp string 占用记忆体.
不过这问题问得不好, 原先是最直觉的写法. 有错吗? (wrong) 不觉得.
不好吗? (bad) 记忆体观点是没错.
效率不好吗? 不一定, 要看 instantiate string object 的 cost 跟
你实作 num->str 的 cost, 做得不好的话:
num->str 也会产生 temp string, append to existing string, free temp string.
这都要看 string library 如何实作.
So no exact answer. 是要考申论题吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.198.77
1F:→ dcam:喔,这是.Net的问题. 我把他想成C++的库,Sorry 220.133.198.77 11/17 23:27
2F:→ dcam:.Net没研究. 220.133.198.77 11/17 23:27
3F:→ tinlans:C++0x 的 move constructor 可以解决你担118.160.107.172 11/18 00:02
4F:→ tinlans:心的这个问题了,虽然这边不是讲 C++。118.160.107.172 11/18 00:03
5F:→ yauhh:直觉,对一些工程师来说只是嘴炮. 218.160.214.23 11/18 08:48
6F:→ dcam:谢谢, 也很久没再注意 C++0x了. 220.133.198.77 11/18 15:49
7F:→ hotdogee:确实是考.net 很简单就是考StringBuilder 118.169.195.10 11/18 16:22
8F:→ hotdogee:用题目的写法会alloc约18GB的记忆体 118.169.195.10 11/18 16:24
9F:→ hotdogee:用StringBuilder则约1MB 118.169.195.10 11/18 16:25
10F:→ dcam:系统会做GC吧. 不会让他长到 18GB. 220.133.198.77 11/18 18:32
11F:→ dcam:18GB/85000= 211KB, 这样对吗? .NET好像很浪 220.133.198.77 11/18 18:33
12F:→ dcam:费. 看起来基本消费挺高的,不过我不了解.net 220.133.198.77 11/18 18:35
13F:→ dcam:只是臆测一下, 请指正. 220.133.198.77 11/18 18:35
14F:→ hotdogee:是 每做一次GC就是一次performance hit 118.169.195.10 11/18 23:08
15F:→ hotdogee:所以会很慢. 会浪费的不是.net 而是人. 118.169.195.10 11/18 23:12
16F:→ hotdogee:18GB是粗略估计=85k*5*85k*0.5 (三角形) 118.169.195.10 11/18 23:14
17F:→ dcam:恩 感恩指教 220.133.198.77 11/19 00:08