World: r3wp
[Core] Discuss core issues
older newer | first last |
BrianH 25-Jan-2009 [12198] | More backports: AJOIN ajoin: func [ "Joins a block of values into a new string." block [block!] ] [ head insert copy "" reduce block ] AJOIN is native in R3 and doesn't generate an intermediate block (it reduces in place), but even in R2 it has advantages: - It always returns a string, no matter what the type of the first value in the block is. - It is faster than REJOIN. |
[unknown: 5] 25-Jan-2009 [12199] | Might change the description a bit to say that is reduces the block. "Reduces a block of values and joins them into a new string." Reducing is a security concern so we might want to ensure whoever uses the function is aware of this. |
BrianH 25-Jan-2009 [12200] | Since that is the doc comment of the R3 version I will submit that concern as a trouble ticket in CureCode. |
Dockimbel 25-Jan-2009 [12201x2] | Brian, in AJOIN, why not prefer the use of [make string! 0] instead of [copy ""] so that REBOL don't need to allocate a literal string to be used only as a prototype? That would reduce memory usage by one string buffer allocation. |
I guess that memory usage is a high concern in mezzanines. | |
BrianH 25-Jan-2009 [12203x2] | COPY "" is faster than MAKE STRING! 0 (amazingly enough), and you don't have to allocate a literal "" every time, just once at LOAD time |
Speed is a bigger concern for mezzanines, but there has to be a balance. We are doing more advanced tricks in R3 to increase speed and reduce memory overhead, but R2 is in bugfix and backport only mode right now. | |
Gabriele 26-Jan-2009 [12205] | Brian, did you compare with make string! reduce ? It may be faster. |
DideC 26-Jan-2009 [12206x2] | In R3 (R2 is a very small bit faster, but I guess its related to the console) : >> t: now/time/precise loop 1000000 [copy ""] print [t - now/time/precise] -0:00:00.203 >> t: now/time/precise loop 1000000 [make string! 0] print [t - now/time/precise] -0:00:00.25 |
Not a big difference if you consider 1'000'000 loop ! | |
Oldes 26-Jan-2009 [12208] | I'm using this version: ajoin: func [ {Faster way how to create string from a block (in R3 it's native!)} block [block!] ][to string! reduce block] |
[unknown: 5] 26-Jan-2009 [12209x2] | It is better Oldes. |
There might be a reason why Brian didn't go that route. | |
BrianH 26-Jan-2009 [12211x3] | Oldes, I can't find any compatibility differences, so that should be fine. Use MAKE instead of TO though - it's faster. |
TO does weird conversion stuff so it is slower than MAKE (which does *less* weird conversion stuff). | |
Paul: I was tired yesterday, which was why I didn't do enough optimization - that's the reason :( | |
[unknown: 5] 26-Jan-2009 [12214] | I'm not complaining Brian. I always do the same. Which is why it is always best to present mezz type of functions ot the community for scrutiny before they go into any builds. Just a wise way of doing things. |
BrianH 26-Jan-2009 [12215x2] | That's why I posted it here before I posted it in DevBase :) |
Wierdly enough, the make string! reduce block version of AJOIN is slightly faster in R3 than the native AJOIN, though it does have that intermediate block overhead - AJOIN could use some optimization. Who said mezzanines had to be slow? | |
[unknown: 5] 26-Jan-2009 [12217x2] | heh |
Yeah, I would think we would want to change that then in R3 so that a mezzanine is not performing faster than native code. | |
Dockimbel 26-Jan-2009 [12219] | Side effect of slow interpreter loop and fast natives. |
BrianH 26-Jan-2009 [12220] | The other way around, Doc. Mezzanines are not slow. It all depends on what the function is doing. Most of the time any interpreter overhead is dwarfed by the work the code is doing. This is why REBOL can be so fast when do much of it is written in REBOL. |
Dockimbel 26-Jan-2009 [12221] | Right for R3 AJOIN exception, other way around. |
Gabriele 27-Jan-2009 [12222] | BTW DideC, if you use now/precise instead of now/time/precise and use difference instead of - then you don't have a problem around midnight. |
DideC 27-Jan-2009 [12223x2] | ...or just avoid benchmarking arround midnight ;-) |
Thanks for the advice anyway. | |
Will 27-Jan-2009 [12225x4] | good tip Gabriele, thx |
about my problem (a couple of messages above) I can confirm that the problem doesn't exist with 2.7.5. 2.7.6, supposedly fixed [call] but did it introduce a new bug? has it maybe to do with hevy cpu, timing, rebol dns helper process? | |
I'm having a hard time producing code that reproduce the bug, if anyone can provide a piece of code that could stresstest [call] I'd be gratefull! 8) | |
or a problem with the GC upon quit when there are many words ? | |
[unknown: 5] 28-Jan-2009 [12229] | I posted a new function in the mezzanine thread at the Tretbase REBOL forum http://www.tretbase.com/forum/viewtopic.php?f=8&t=30&p=130#p130 |
Sunanda 28-Jan-2009 [12230] | Nice start, Paul, to pulling the teeth of code you do not want to execute I think you need to handled action!s too, otherwise some executable code can slip by: >> defunction [abs trim change make select remove sort] ;; etc, anything that is an action! == [abs trim change make select remove sort] |
[unknown: 5] 28-Jan-2009 [12231] | It is an easy modification but I actually made it to allow actions as I was using it briefly for that purpose. |
[unknown: 5] 29-Jan-2009 [12232] | Posted the get-block function to the mezzanine thread on the Tretbase forum http://www.tretbase.com/forum/viewtopic.php?f=8&t=30&p=131#p131 |
Josh 30-Jan-2009 [12233] | Is there a simple way to convert a char number to the actual integer? (i.e. to-integer #"5" giving 5 as a result) |
Izkata 30-Jan-2009 [12234] | I usually go with: to-integer to-string #"5" |
Josh 31-Jan-2009 [12235] | Thank you |
Henrik 31-Jan-2009 [12236] | >> to-integer form #"5" == 5 Saves a couple of chars :-) (but profile it, it might be slower) |
Chris 31-Jan-2009 [12237x2] | to-integer #"5" - 48 |
-48 + #"5" | |
Steeve 31-Jan-2009 [12239x2] | >> 0 + #"5" ==53 Usually, i use the the following tricks: you can add several chars with integers in that way. If the first value is an integer! it's returning an integer! If the first value is a char! it's returning a char! >> 0 + #"5" - #" " == 21 >> #" " + 21 == #"5" |
i mean, it was what chris tried to explain.. | |
kcollins 31-Jan-2009 [12241x2] | Here's another way which is arguable cleaner, but more verbose and less efficient: p: "3" (index? find "0123456789" p) - 1 |
arguable => arguably | |
Josh 31-Jan-2009 [12243x2] | Thanks again, guys. |
Someone had played around with doing huge integers in REBOL a while back, right? | |
Gregg 1-Feb-2009 [12245] | I have a partial string-math library. Not all ops, but no size limits. |
Tomc 1-Feb-2009 [12246x2] | I have a 24 bit math implementation to do RSA but never converted to or from other bases. It is from before Holgar did encryption with thebignum library nativly in core/view which renders mine moot |
and it isarbitrry precision as well | |
older newer | first last |