World: r3wp
[!REBOL3]
older newer | first last |
Henrik 19-Nov-2010 [6232] | +1 here too |
Sunanda 19-Nov-2010 [6233] | As Brian says, case sensitive map is easy to do with binary keys. Here's my implementation of such, for anyone who needs it today). Improvement suggestions are welcome! http://www.rebol.org/view-script.r?script=r3-rehash.r |
Oldes 19-Nov-2010 [6234x2] | The problem is, that using something like this will slow down the evaluation.. the reason why we were using hash! in R2 was the speed. |
Case sensitivnes is very common outside our REBOL world. | |
Sunanda 19-Nov-2010 [6236] | I've tried some timing tests..... r3-rehash seems around 10% faster than native R2 hashes on my test data. That does not remove the speed increase that an R3 native hash may have. But it does suggest that migrating from R2 hash to R3 rehash will not cost performance. |
Oldes 19-Nov-2010 [6237] | That's probably because R2 hashes all values but R3 just the keys. But good result anyway. |
Sunanda 19-Nov-2010 [6238x2] | That sounds a likely explanation, thanks. |
My timing tests were flawed.....R3-rehash is __significantly__ faster than R2 native hash. That is still true even if we remove the set-up time and just look at random retrieval. {Of course that is based on my random dataset....your's may vary] | |
Kaj 19-Nov-2010 [6240] | Thanks for testing. I'd been wondering about that for some time |
GrahamC 19-Nov-2010 [6241x3] | NIST has decreed that federal agencies must move from SHA1 to SHA2 after 2010. I found this JS implementation .. anyone able to convert JS to R3 code? |
http://sourceforge.net/projects/jssha/files/jsSHA/1.3/jsSHA-1.3.zip/download | |
There's also this SHA2 library written in Haskell http://davidmercer.nfshost.com/projects/shaskell/shaskell.html | |
PeterWood 19-Nov-2010 [6244] | From a quick look, it doesn't seem that it should be too hard to convert the JS to R3 on Big Endian systems. |
Andreas 19-Nov-2010 [6245] | which sha-2 do you need? |
GrahamC 19-Nov-2010 [6246x2] | It doesn't matter .. sha-256 is good |
Ideally we should have an encryption port so we can also compute SHA2 on large files as we can with R2 | |
Pekr 20-Nov-2010 [6248] | Whole functionality of encryption ports should be imo added into R3, if not already there ... |
Sunanda 25-Nov-2010 [6249] | Are there are practical differences between these two R3 ways of extending an object? obj: make object! [] extend obj 'a 1 bind/new 'b obj obj/b: 2 probe obj == make object! [ a: 1 b: 2 ] |
Steeve 25-Nov-2010 [6250] | Extend is a mezz, so that much be slower. And I always try to avoid GC overheads due to excessive usage of 'reduce Thats why I think bind/new is more capable especially, this form: >set bin/new 'b obj 2 instead of: >>bind/new 'b obj obj/b: 2 |
Andreas 25-Nov-2010 [6251x2] | Besides the readability/performance trade-off, things also start to differ when non-true? values are involved: obj: make object! [] extend obj 'a none extend obj 'b false set bind/new 'c obj none set bind/new 'd obj false print mold obj ==> make object! [ c: none d: false ] |
(Which probably is a bug in EXTEND.) | |
Steeve 25-Nov-2010 [6253x2] | Nice catch |
Hum... Seems not a bug, but deliberate. | |
Sunanda 25-Nov-2010 [6255] | EXTEND is a wrapper for APPEND....So are there any practical advantages in using BIND/NEW rather than APPEND ? append obj [c: 3] == make object! [ a: 1 b: 2 c: 3 ] I know right now there are some differences when messing with PROTECT/HIDE, but there are many CureCodes to go before we'll know if those differences are for real. |
BrianH 25-Nov-2010 [6256x4] | I like the SET BIND/new trick. There has already been code in the mezzanines where such a trick would come in handy, but it had never occurred to me. Thanks Steeve! |
The practical advantages of the SET BIND/new trick as opposed to APPEND is that you don't have to REDUCE a block to be appended. The point to the IF :val guard in EXTEND was to screen out false and none in GUI code, but that is likely no longer necessary. There was a blog where it was suggested that EXTEND be rewritten to work differently, but I think that various natives were enhanced instead. EXTEND is now a little anachronistic. | |
I think that the code where we wanted to screen out none in the GUI code is now using the map! type instead, which does this itself. | |
Btw Steeve, mezzanines aren't necessarily slower than natives, particularly in R3. It all depends on how much work is being done by the function. Interpreter overhead is really low in R3. Mezzanines can use more memory though, but we are enhancing the natives here and there to make it possible to lower the memory use of mezzanines - enhancements like the /into option. | |
Andreas 25-Nov-2010 [6260x4] | Based on some simple experiments I did some time ago, mezzanines are roughly 2.5 times slower than the aequivalent command (i.e. extension function). |
That was for functions with minimal arithmetic, so that should basically be mostly the additional function call overhead. | |
Real natives should be a bit faster still. | |
Should probably dig out those experiments again to see exactly what I was measuring (or redo them), but that's the number that stuck with me :) | |
Kaj 25-Nov-2010 [6264] | That would indeed be very low overhead |
BrianH 26-Nov-2010 [6265] | And even less for regular mezzanines, which generally contain calls to more advanced native functions rather than just minimal arithmetic. |
Sunanda 26-Nov-2010 [6266] | Thanks for the EXTEND vs APPEND vs BIND discussion, guys. It can be useful to have different mechanisms that have their own default behaviours. One use of BIND/NEW is that it allows words to be unset when an object is created: obj: context [bind/new 'word self] ;; this works, and WORD is UNSET! obj: context [word: #[unset!]] ;; this does not work * Script error: word: needs a value * Where: make context * Near: make object! blk |
BrianH 26-Nov-2010 [6267] | APPEND object! word! does the same thing. |
Kaj 26-Nov-2010 [6268] | Well, I don't think REBOL suddenly has the speed of C |
BrianH 26-Nov-2010 [6269] | Certainly not for C-like code, agreed. But if you are writing REBOL-like code then you are mostly calling fairly complex functions that are written in very good C, functions like PARSE and APPEND. Most of the code you run in REBOL is actually implemented in C, including the interptreter itself. So in that case REBOL has the speed of the C that it is written in. |
Kaj 26-Nov-2010 [6270x2] | I just feel you're overdoing it a bit. If you were to follow that reasoning through, the conclusion would have to be that REBOL has negligable overhead over C. Indeed, that's what some people claim on the web because they heard it somewhere in the community, and that's how REBOL people become known to the outside world as lying or delusional |
Among dynamic languages, REBOL is slow. Not the slowest, but slow. Not that this matters in practice, but that's a whole other set of myths | |
BrianH 26-Nov-2010 [6272] | Perl can also have the same speed as C under similar circumstances. It all depends on how heavy the native functions that you are calling are. But unlike most dynamic languages, REBOL is optimized for hand-optimization and doesn't have a semantic model that even vaguely resembles that of C code, so you can't just transliterate code from another language to REBOL and expect to get the same performance. REBOL is *really* slow for the type of code that requires a compiler to be efficient, but it can be *really* fast at the kind of code that other languages have a lot of trouble dealing with at all because they have to manually implement a lot of stuff that REBOL has built-in in native code. |
Kaj 26-Nov-2010 [6273] | I understand your reasoning, but it all comes down to whether you want to be perceived by the outside world as delusional or not |
BrianH 26-Nov-2010 [6274] | It is not a myth that REBOL is fast. It can sometimes be misunderstood though, because people who are familiar with other languages will try to write code in the style of those other languages and expect it to be fast. REBOL code written in REBOL style for tasks that REBOL is suited for can be very fast. |
Kaj 26-Nov-2010 [6275] | Very fast doesn't mean anything. For the outside world it does, because they're comparing it to something |
BrianH 26-Nov-2010 [6276x2] | And for other tasks, we have extensions. |
I think that the outside world would consider me delusional for choosing a language that isn't compiled, or (worst sin of all) doesn't have a C-like syntax. Most people think hand-optimization is insane in the modern world. And in some circumstances (and for many programmers) it is a bit crazy. But when you already can hand-optimize and understand the semantic model of the language you are using, and how it is different from other languages, then it's not so crazy. Differences matter. And I only use REBOL where it is appropriate, at least in comparison to the overhead of learning another tool. | |
Kaj 26-Nov-2010 [6278x2] | Rather than focusing on the details and claiming REBOL is fast in details, I would typify REBOL as a slow language that allows you to write fast algorithms |
Algorithms dominate speed over details in almost all programs | |
BrianH 26-Nov-2010 [6280] | It goes the other way too: If you try to write REBOL-like code in most other languages then you will run into a wall. For most you will need to reimplement most of the natives before you can start, if it is possible to do REBOL-like code at all (often not with parsers). And when you do manage to get that code running it is often slower than REBOL code because of the optimization its natives have gone through. |
Kaj 26-Nov-2010 [6281] | Yes, Greenspun's tenth rule |
older newer | first last |