<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: 一门天生就能损害人视力的语言 -&gt; Erlang？</title>
	<atom:link href="http://erlang-china.org/misc/erlang_syntax.html/feed" rel="self" type="application/rss+xml" />
	<link>http://erlang-china.org/misc/erlang_syntax.html</link>
	<description>erlang 中文社区</description>
	<lastBuildDate>Mon, 21 May 2012 07:55:26 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<item>
		<title>By: jackyz</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8884</link>
		<dc:creator>jackyz</dc:creator>
		<pubDate>Mon, 08 Dec 2008 05:00:13 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8884</guid>
		<description>＠xvyu，这么说吧，其实这个问题我感觉和 record 到底费不费时间关系不大，反而更象是一个 “程序调优的最佳实践” 问题。写程序的时候应该关注性能，但仍然有一个 “什么时机关注” 的问题。如果你有兴趣，推荐你去看《代码大全》的相关章节。</description>
		<content:encoded><![CDATA[<p>＠xvyu，这么说吧，其实这个问题我感觉和 record 到底费不费时间关系不大，反而更象是一个 “程序调优的最佳实践” 问题。写程序的时候应该关注性能，但仍然有一个 “什么时机关注” 的问题。如果你有兴趣，推荐你去看《代码大全》的相关章节。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: xvyu</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8875</link>
		<dc:creator>xvyu</dc:creator>
		<pubDate>Sun, 07 Dec 2008 09:29:56 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8875</guid>
		<description>我的程序里要修改的状态变量是比较复杂的record，每个大概都有20个属性，所以我才有性能上的忧虑，当然变量数量没有100个这么多。

不过，变量复制的代价是可以接受的，多谢你的回复。

你们翻译的《Programming Erlang》出版得太晚了，英文电子版我已经看了好几遍，不然一定买。

还有就是感觉那本书太基础了些，erlang领域有没有深一些的书籍呢。</description>
		<content:encoded><![CDATA[<p>我的程序里要修改的状态变量是比较复杂的record，每个大概都有20个属性，所以我才有性能上的忧虑，当然变量数量没有100个这么多。</p>
<p>不过，变量复制的代价是可以接受的，多谢你的回复。</p>
<p>你们翻译的《Programming Erlang》出版得太晚了，英文电子版我已经看了好几遍，不然一定买。</p>
<p>还有就是感觉那本书太基础了些，erlang领域有没有深一些的书籍呢。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jackyz</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8871</link>
		<dc:creator>jackyz</dc:creator>
		<pubDate>Sun, 07 Dec 2008 07:02:41 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8871</guid>
		<description>测试写得很不错。 :D

对于这个结果，我的看法不同。我们写程序时，性能不应该被预先排在第一位，就算单单只考虑性能，问题也往往会很复杂。

record 的 copy 毕竟也是 copy，肯定会有消耗。它比增加变量要复杂，才慢上 3 倍，已属不错(我估计，如果 record 更复杂，会慢得更多)。不过执行 1 次消耗 0.172 毫秒，在性能上，完全处在可以接受的范围。况且，这样的语法，还有易于理解，便于维护的好处(比如，要加一个字段)。

如果对采用 record 的程序改用 &quot;增加变量&quot; 的方式来改写，且不谈对程序的可读性会带来多大影响，单从性能而言，我认为对整体性能提升的贡献也可能极为有限(比如，毫秒级)，而通过 profiler 你可能会发现严重得多的性能瓶颈(比如，逻辑上的问题，IO，流程等等)，修正这些问题往往会带来大得多的性能提升(比如，解决了一个瓶颈，一下子快上个几十上百倍完全是有可能的)。</description>
		<content:encoded><![CDATA[<p>测试写得很不错。 <img src='http://erlang-china.org/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>对于这个结果，我的看法不同。我们写程序时，性能不应该被预先排在第一位，就算单单只考虑性能，问题也往往会很复杂。</p>
<p>record 的 copy 毕竟也是 copy，肯定会有消耗。它比增加变量要复杂，才慢上 3 倍，已属不错(我估计，如果 record 更复杂，会慢得更多)。不过执行 1 次消耗 0.172 毫秒，在性能上，完全处在可以接受的范围。况且，这样的语法，还有易于理解，便于维护的好处(比如，要加一个字段)。</p>
<p>如果对采用 record 的程序改用 &#8220;增加变量&#8221; 的方式来改写，且不谈对程序的可读性会带来多大影响，单从性能而言，我认为对整体性能提升的贡献也可能极为有限(比如，毫秒级)，而通过 profiler 你可能会发现严重得多的性能瓶颈(比如，逻辑上的问题，IO，流程等等)，修正这些问题往往会带来大得多的性能提升(比如，解决了一个瓶颈，一下子快上个几十上百倍完全是有可能的)。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: xvyu</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8869</link>
		<dc:creator>xvyu</dc:creator>
		<pubDate>Sun, 07 Dec 2008 04:08:15 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8869</guid>
		<description>测试了一下，差别还是蛮大的

-record(obj,{x1,x2,x3,x4,x5}).

start()-&gt;
	N = 1000000,
	Obj = #obj{x1=N,x2=0,x3=0,x4=0,x5=0},
	T0 = now(),
	loop1(N,Obj),
	T1 = now(),
	loop2(N,0,0,0,0,0),
	T2 = now(),
	loop3(N,0),
	T3 = now(),
	io:format(&quot;T:~p,~p,~p~n&quot;,[timer:now_diff(T1,T0),timer:now_diff(T2,T1),timer:now_diff(T3,T2)]).

loop1(0,_)-&gt;
	ok;
loop1(N,Obj)-&gt;
	loop1(N-1,Obj#obj{x1=N}).

loop2(0,_,_,_,_,_)-&gt;
	ok;
loop2(N,X1,X2,X3,X4,X5)-&gt;
	loop2(N-1,N,X2,X3,X4,X5).

loop3(0,_)-&gt;
	ok;
loop3(N,X1)-&gt;
	loop3(N-1,N).

结果如下：
T:172000,47000,46000

可以看出复制数据的开销确实不小，增加函数参数也会带来一定开销，但相对小很多。</description>
		<content:encoded><![CDATA[<p>测试了一下，差别还是蛮大的</p>
<p>-record(obj,{x1,x2,x3,x4,x5}).</p>
<p>start()-&gt;<br />
	N = 1000000,<br />
	Obj = #obj{x1=N,x2=0,x3=0,x4=0,x5=0},<br />
	T0 = now(),<br />
	loop1(N,Obj),<br />
	T1 = now(),<br />
	loop2(N,0,0,0,0,0),<br />
	T2 = now(),<br />
	loop3(N,0),<br />
	T3 = now(),<br />
	io:format(&#8220;T:~p,~p,~p~n&#8221;,[timer:now_diff(T1,T0),timer:now_diff(T2,T1),timer:now_diff(T3,T2)]).</p>
<p>loop1(0,_)-&gt;<br />
	ok;<br />
loop1(N,Obj)-&gt;<br />
	loop1(N-1,Obj#obj{x1=N}).</p>
<p>loop2(0,_,_,_,_,_)-&gt;<br />
	ok;<br />
loop2(N,X1,X2,X3,X4,X5)-&gt;<br />
	loop2(N-1,N,X2,X3,X4,X5).</p>
<p>loop3(0,_)-&gt;<br />
	ok;<br />
loop3(N,X1)-&gt;<br />
	loop3(N-1,N).</p>
<p>结果如下：<br />
T:172000,47000,46000</p>
<p>可以看出复制数据的开销确实不小，增加函数参数也会带来一定开销，但相对小很多。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jackyz</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8860</link>
		<dc:creator>jackyz</dc:creator>
		<pubDate>Sat, 06 Dec 2008 01:30:07 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8860</guid>
		<description>@xvyu，这里是一个设计决策。

A。为时间和空间上的性能考虑，允许修改内存，但会引入 “顺序瓶颈” 。
B。不允许修改内存，用更 “浪费” 的方式，但不会引入 “顺序瓶颈” 。

你已经知道 Erlang 在这里的设计决策是方案 B。

另外，语义和语句是两回事，虽然没有看到确切的代码，但在实现上 BEAM 的底层并不一定会排斥 “修改内存” 的实现手段。比如，若能通过语义分析排除 “共享” 的情况，完全可以很安全的使用 “修改内存” 的方式来实现上述语义。

使用“高级语言”时，如果总是忍不住在揣度它的底层实现，并因此而担心“时间和空间开销”。那还不如自己动手，写段测试代码来一探究竟。若有所收获，可别忘了与社区共享哦。 :)</description>
		<content:encoded><![CDATA[<p>@xvyu，这里是一个设计决策。</p>
<p>A。为时间和空间上的性能考虑，允许修改内存，但会引入 “顺序瓶颈” 。<br />
B。不允许修改内存，用更 “浪费” 的方式，但不会引入 “顺序瓶颈” 。</p>
<p>你已经知道 Erlang 在这里的设计决策是方案 B。</p>
<p>另外，语义和语句是两回事，虽然没有看到确切的代码，但在实现上 BEAM 的底层并不一定会排斥 “修改内存” 的实现手段。比如，若能通过语义分析排除 “共享” 的情况，完全可以很安全的使用 “修改内存” 的方式来实现上述语义。</p>
<p>使用“高级语言”时，如果总是忍不住在揣度它的底层实现，并因此而担心“时间和空间开销”。那还不如自己动手，写段测试代码来一探究竟。若有所收获，可别忘了与社区共享哦。 <img src='http://erlang-china.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: xvyu</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8843</link>
		<dc:creator>xvyu</dc:creator>
		<pubDate>Fri, 05 Dec 2008 08:29:55 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8843</guid>
		<description>多谢楼上的回答

我写的代码只是举例，实际使用并不是这个情形

包装成record我也考虑过，但有另外一个担忧。每次更改一个属性，都要复制整个record，在上面的例子，就是100倍的时间和空间开销。</description>
		<content:encoded><![CDATA[<p>多谢楼上的回答</p>
<p>我写的代码只是举例，实际使用并不是这个情形</p>
<p>包装成record我也考虑过，但有另外一个担忧。每次更改一个属性，都要复制整个record，在上面的例子，就是100倍的时间和空间开销。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: J</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8797</link>
		<dc:creator>J</dc:creator>
		<pubDate>Thu, 04 Dec 2008 15:15:13 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8797</guid>
		<description>@xvyu，如果想更通用，你还有 proplist 数据类型可以用。</description>
		<content:encoded><![CDATA[<p>@xvyu，如果想更通用，你还有 proplist 数据类型可以用。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: J</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8796</link>
		<dc:creator>J</dc:creator>
		<pubDate>Thu, 04 Dec 2008 15:13:05 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8796</guid>
		<description>@xvyu，你的数据结构，也就是参数之中的那些 X1,X2,X3,……,X100 是否适合考虑包装成一个 record 呢？

-record(state, {a, b, c, d}).

loop(State)-&gt;
receive
{update,a}-&gt;
  loop(State#state{a=State#state.a + 1});
{update,b}-&gt;
  loop(State#state{b=State#state.b + 1}});
……
{update,d}-&gt;
  loop(State#state{d=State#state.d + 1}})
end.

更进一步，如果你的对应关系如此明确的话，record 仍是 tuple ，你还有 nth() 函数可以用。</description>
		<content:encoded><![CDATA[<p>@xvyu，你的数据结构，也就是参数之中的那些 X1,X2,X3,……,X100 是否适合考虑包装成一个 record 呢？</p>
<p>-record(state, {a, b, c, d}).</p>
<p>loop(State)-&gt;<br />
receive<br />
{update,a}-&gt;<br />
  loop(State#state{a=State#state.a + 1});<br />
{update,b}-&gt;<br />
  loop(State#state{b=State#state.b + 1}});<br />
……<br />
{update,d}-&gt;<br />
  loop(State#state{d=State#state.d + 1}})<br />
end.</p>
<p>更进一步，如果你的对应关系如此明确的话，record 仍是 tuple ，你还有 nth() 函数可以用。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: anonymous</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8781</link>
		<dc:creator>anonymous</dc:creator>
		<pubDate>Thu, 04 Dec 2008 10:51:07 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8781</guid>
		<description>很显然，能指望在一个java的网站上，看到说其它东西好的更多言论吗？
说损害视力是不负责任的，自己没试过就相信这种说法，唉</description>
		<content:encoded><![CDATA[<p>很显然，能指望在一个java的网站上，看到说其它东西好的更多言论吗？<br />
说损害视力是不负责任的，自己没试过就相信这种说法，唉</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Magicloud</title>
		<link>http://erlang-china.org/misc/erlang_syntax.html/comment-page-1#comment-8775</link>
		<dc:creator>Magicloud</dc:creator>
		<pubDate>Thu, 04 Dec 2008 07:49:19 +0000</pubDate>
		<guid isPermaLink="false">http://erlang-china.org/?p=285#comment-8775</guid>
		<description>所谓“损害视力”，原因很简单，fp中没有变量，于是会有用 函数调用、表达式、列表领悟 等写在一行的情况（比如javaeye上那贴的那行代码），没有好的格式化，没有书写者自己的处理，说它损害视力不为过。
不过，如果因为书写者不肯美化而认定语言是坏的，那非fp语言中的如下代码：
var1 = fun1 ();
var2 = fun2 (var1);
var3 = fun3 (var2);
写成：
var3 = fun3 (fun2 (fun1 ()))
也实在是损害视力。

但是，这个问题也有其他解决方法，比如haskell就提供了一些难于看懂但确实比较美观的“省略”语法（$、.等）。</description>
		<content:encoded><![CDATA[<p>所谓“损害视力”，原因很简单，fp中没有变量，于是会有用 函数调用、表达式、列表领悟 等写在一行的情况（比如javaeye上那贴的那行代码），没有好的格式化，没有书写者自己的处理，说它损害视力不为过。<br />
不过，如果因为书写者不肯美化而认定语言是坏的，那非fp语言中的如下代码：<br />
var1 = fun1 ();<br />
var2 = fun2 (var1);<br />
var3 = fun3 (var2);<br />
写成：<br />
var3 = fun3 (fun2 (fun1 ()))<br />
也实在是损害视力。</p>
<p>但是，这个问题也有其他解决方法，比如haskell就提供了一些难于看懂但确实比较美观的“省略”语法（$、.等）。</p>
]]></content:encoded>
	</item>
</channel>
</rss>

