From: Christoph Date: 2002-07-31T23:47:05+09:00 Subject: A truth? patch + benchmarks This is a multi-part message in MIME format. ------=_NextPart_000_0001_01C238B1.96AE08F0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit > -----Original Message----- > From: YANAGAWA Kazuhisa [mailto:kjana@dm4lab.to] > Sent: Friday, July 26, 2002 12:11 PM > To: ruby-core@ruby-lang.org > Subject: Re: [PATCH] object.c ruby.h (fwd) > > In message > Dave@PragmaticProgrammer.com writes: > > > So, perhaps, if the expression to pass to 'if', 'while', and friends > > isn't 'true' or 'false', the interpreter should call #truth? on it to > > coerce it into a truth value.[1] > > > > If that sounds logical, then perhaps #to_truth might be a more > > consistent name. > > That's like my old proposal on.... where? :-) Matz rejected that since > its cost may be too expensive. So if you state it strongly, show its > usefulness and effective implementation. Trying to answer your first question, it seems to me that Every time you are dealing with the Null-Pattern such a facility might come in handy. The proliferation of the ``false'' value in Python and indirectly the existence of the conversion methods #to_something in the NilClass are a testimony for this. I also cooked up simple minded an implementation. It is based on a FL_FALSE flag (I defined it to be 1<<5 not sure if this can case any problem?) similar to the frozen or tainted flags - that is I added there methods (the method names ain't great ..) #falsify : the ``truth-state'' is set to false) #verify : the ``truth-state'' is set to true) #truth? : tests the truth state. obj.truth? returns true if obj is an immediate value != false,nil (in other words obj is a Symbol, Fixnum or ``True'') or obj non immediate object and the false flag is not set. A welcome side affect of this implementation is, that you cannot change the truth-state of Fixnums and O particular so Perl fans would be still pissed off;-)). A few words about the included benchmarks. I pitted 3 type of implementation (and two compilers Mingw32 and VC7) against each other. a) Stock Ruby (as of today). b) The patched Ruby c) The patched Ruby where I replaced the macro calls RTEST(ruby_debug) and RTEST(rbuy_verbose) with PURE_RTEST(ruby_debug) and PURE_RTEST(ruby_verbose) macro call - where PURE_TEST is ``original RTEST'' macro. The first test is a gc and memory intensive problem. (It is a solution to Tobias Reif [ruby-talk:33425] maximal anagram chain problem - my wordlist contains about 230,000 English words). In this test a) & b) perform about the same but c) is ~ 10 percent faster. The second test is the simple ``program flow test'' (no gc work involved). --- # loop.rb require 'benchmark' include Benchmark i = 0 bm do |x| x.report do while (i) do i+= 1 i = nil if i == 5000000 end end end --- The result are quite surprising. Both b) and c) (which is slightly slower in this case) outperform a) by almost 20 percent. All in all even if the false flag scheme is rejected it is probably a good idea to replace some of the current RTEST(obj) macro calls with an inlined c-function version. /Christoph ------=_NextPart_000_0001_01C238B1.96AE08F0 Content-Type: application/octet-stream; name="bench.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bench.tar.gz" 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 Xttr+923XwD8AexhACgAAA== ------=_NextPart_000_0001_01C238B1.96AE08F0 Content-Type: application/octet-stream; name="patch.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="patch.tar.gz" H4sIAEX3Rz0AA+1WbW/bNhDO1+hXMC1QSJWdULJeEidZo3ryKswvqaUU274Ijk3FGhQp0Evhrc1+ +46UZEtJl/pDs2IYHySmeLwjj3fkw7ub54vV0d6zAmMNm6YJLVZM3WAt/NG2xh42dVUxzZ6mgFzB KjRIf163ShRZPk8R2huTp/UmSfwVjf8k7lj+4+KWpOHikPW++Ro024Zh/FP+FaypD/KvUnWEv7kn X8D/PP/dbhfV2V8cKod6b1/FWO1is9tTkIL7utHXlcPNRUUyhnFBluWtWdMCa33N6CvHjywuLlBX 0U/0joFk1io9dHEhoHsBCQhykIcL9MEaXdmCHIRrP08LIibXv0uCjABsBEH/VJA/laKU5EUao/dU E6T3gizIrXkQnedPkib+nQi+SgLazgT9UwF9Kr0yjBPmlWEaHZM5xea/9pckCGPiZ2F8E5E8if1b kq+SpQhDCyfOyQ1JO+hFGC+LBVn6QZrcvuhQuzDO/aa0gxTplO6zPW9jtmG4BpdgsjzxM5iEhQA+ O+AemMo7GKZFvnpTm0JMOgjvumi4VOP5LamMq15t/71PKMdzouT/tLj+45nIf++r/K/qjfe/R8cV VVV0zv//Bij/s+yvgPwNdWfyL20eML9q9lX9y8xvUGqVaXPMGPZlSUfofRxGwE9aQ1LE8IWM/f2j 14h9g3SJPs6jgqAgSdFdNF+QVRItSYpeHwFDdWvTmWe7nvhRQqIoMp6XaOcV+ouuIqGDc6A0Qa61 L69mtr8x2c1mqw4EyijXz0mWiyCStluYOCP/svRjO+X5OdusRCm5VhyMLNf1p0M6Thk5mmeZnwQN M4mFT8PH9IXS8En1QG38GTojm72TEERx5g8scG82DCMiMWlrteHId53JTyPbm05o58q1Z3i7N5AM rZFrswdDVM7OdKllO7ZmP6PNoNEeHDoTa+T8ZpeDZnvQs5yJt7E8rvakmvRIaGq9p5bJ1dhyYTUR r4Pg7Iw5+84ZelIz3e6lPXCskT+YTlwPAr6GgDvjsf2jY3l22f/8GR2UOVtLjTTuaNk4IetHobTe QuSp4cHj2R5sn03QCUB3a/dGnL21XGcAn90fgmh+k70SA0nq4zI6BlZpxg2sdVSlCo/9i2fPJlUF U77oSZGziiPLl2FcfzWEJIUKhd5VH77COEjoi16XSWEcUQ+hWoHIhAGqrpr4zvoAQZhNvan366Xt Qtzah31TjNGIkigjTCHMnqjZXpJ4GQZV7QZLiex6wTVjR7eq6Kh8mwV2ACqFqtZTTlul30EdQqpT B7E+xWXVdM9+K31My0T439SbVQCqcvHJELSuZyMA35u/OTg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4 HuJvdiWTqQAoAAA= ------=_NextPart_000_0001_01C238B1.96AE08F0--