World: r3wp
[!REBOL3-OLD1]
older newer | first last |
BrianH 9-Feb-2009 [10867x3] | People in general didn't use list!, because of the bugs and because block! was good enough for most uses. We haven't felt its lack for a year now. Most of the advantage of list! in regular code was handled by allowing insert and remove at the head of a block! to expand or contract the block, just like it does at the end, without a block copy. Just by making block! more efficient for inserts and removes, we have made list! even less necessary. |
For that matter, you can make blocks even faster by getting rid of list!, just by enabling more optimizations. | |
The real advantage of list! wasn't the speed though, it was the alias persistancy. That was the source of the bugs in list! too. | |
Rebolek 9-Feb-2009 [10870] | I tested vector! extensively about one and half year ago. Not much changed, I think. The BIGGEST problem with vector! is that it's zero based. |
BrianH 9-Feb-2009 [10871] | Trust me, vector! has bigger problems than that right now. I expect that it will not end up 0-based though, even with all of the advantages that 0-based vectors give us. It is likely that we will instead have 0-based versions of PICK and POKE that work on all series. |
Rebolek 9-Feb-2009 [10872] | Brian, all the vector! tickets are mine, so I know very well about vector! problems :) I'm not sure about zero based PICK and POKE, I would probably prefer PICKZ and POKEZ, but I can get used to it. |
BrianH 9-Feb-2009 [10873] | Yes, those would be good names for the aformentioned 0-based versions of PICK and POKE. PICK0 and POKE0 have also been suggested as names, though I prefer *Z. They could be natives (or mezzanines?) that call PICK and POKE internally. I think the only reason we don't have them already is that PICK is an action!, and the naming disagreement. |
Kaj 9-Feb-2009 [10874] | Are blocks stored in memory as linked fragments? |
Steeve 9-Feb-2009 [10875] | no |
Kaj 9-Feb-2009 [10876] | How can inserts at the head and tail be done without moving the block, then? |
Steeve 9-Feb-2009 [10877] | you asked for blocks not for lists |
Kaj 9-Feb-2009 [10878] | Yes, Brian talks about blocks above |
Steeve 9-Feb-2009 [10879] | where ?, i don't think so |
Kaj 9-Feb-2009 [10880] | Iīm not talking about links for each item, but for fragments determined during use |
Steeve 9-Feb-2009 [10881] | uh ? he just said that the performance have been improved with block operations, so that lists are no more requested. He didn't say that blocks are working like lists now |
Kaj 9-Feb-2009 [10882] | I didnīt say that, either. But there must be something going on if you can insert without moving the memory |
Steeve 9-Feb-2009 [10883] | where did he said that ? |
Kaj 9-Feb-2009 [10884] | One screen up |
Steeve 9-Feb-2009 [10885] | this ? "Just by making block! more efficient for inserts and removes, we have made list! even less necessary." |
Kaj 9-Feb-2009 [10886] | The only way I can think of to keep the memory contiguous is advanced use of the hardware MMU, which would lead to partially used memory pages at the start and end of each block |
Steeve 9-Feb-2009 [10887] | >> a: [] == [] >> dp [append a 1] == make object! [ timer: 32 evals: 11 eval-natives: 4 eval-functions: 1 series-made: 2 series-freed: 1 series-expanded: 1 series-bytes: 464 series-recycled: 0 made-blocks: 1 made-objects: 0 recycles: 0 ] as you can see the block has been expanded, which means copied in another place |
Kaj 9-Feb-2009 [10888] | That would contradict Brianīs statement even about R2 |
Steeve 9-Feb-2009 [10889] | Don't see when he stated that, anyway we just have to wait his return |
Kaj 9-Feb-2009 [10890x2] | ĻPeople in general didn't use list!, because of the bugs and because block! was good enough for most uses. We haven't felt its lack for a year now. Most of the advantage of list! in regular code was handled by allowing insert and remove at the head of a block! to expand or contract the block, just like it does at the end, without a block copy. Just by making block! more efficient for inserts and removes, we have made list! even less necessary.Ļ |
So it already worked that way for appends in R2 | |
[unknown: 5] 9-Feb-2009 [10892x3] | Is that profiling accurate Steeve? |
>> dp [a: [] b: []] == make object! [ timer: 15 evals: 12 eval-natives: 3 eval-functions: 1 series-made: 1 series-freed: 0 series-expanded: 0 series-bytes: 432 series-recycled: 0 made-blocks: 1 made-objects: 0 recycles: 0 ] >> | |
Shouldn't made-blocks indicate 2 blocks were created? | |
Steeve 9-Feb-2009 [10895x2] | no to Kaj, no to Paul :-) To kaj: Brian is talking about lists, not blocks. Your test do not append or insert data in the input blocks, it's not relevant. To Paul: No, the 2 blocks are created before entering in the dp function, dp doesn't create them. |
>> dp [] == make object! [ timer: 14 evals: 8 eval-natives: 3 eval-functions: 1 series-made: 1 series-freed: 0 series-expanded: 0 series-bytes: 432 series-recycled: 0 made-blocks: 1 made-objects: 0 recycles: 0 ] see, a block is always created by dp | |
BrianH 9-Feb-2009 [10897x2] | If the block needs to be expanded because there isn't enough allocated the system does a block copy. If there *is* enough allocated, as when you preallocate using make block!, then the system doesn't have to do a block copy. That is R2 and R3. What is new in R3 is that the "head" pointer of a block doesn't have to point to the beginning of the allocated memory, just like the "tail" pointer in R2. This means a remove from the head of the block just shifts the pointer over one in R3, while in R2 you had to copy over the rest of the block contents to shift it towards the head of the allocated memory. Preallocated memory can also exist before the head of the block contents in R3. This means that there is no difference in overhead between inserts at the head or the tail of a block in R3. In theory, inserts inside the block in the first half could be more efficient because you would only have to shift from the nearest end, not the tail. I don't know whether this optimization has been implemented. Block operations in general could be faster because with no list! type we wouldn't have to special-case as much code, so we could make our code much faster through more aggressive optimization. Btw, I submitted a tweak to DP to make it more accurate by subtracting its own overhead. It still has some variance though - have to tweak the native to fix that. Plus there is the extreme variance caused by Windows. |
I hope this answers your question, Kaj. | |
Pavel 9-Feb-2009 [10899] | Back to map Brian's note words-of returns all keys is easy to overlook, but this is only way how to traverse thru map (when no next is at hand) THX Brian |
BrianH 9-Feb-2009 [10900] | There is a proposal (looking likely to be implemented) to have FOREACH work on object! and map! types. The word list syntax would be restricted, but you could do your traversal that way. In the meanwhile you have WORDS-OF to get the keys in a block, VALUES-OF to get the values in a block, BODY-OF object! to get both in a block (map! proposed too) and TO-BLOCK of map! to get both in a block. It works, but the FOREACH proposal would create fewer intermediate blocks. |
Pavel 9-Feb-2009 [10901] | THX again, is it possible something like "select" ie <,>,between etc? |
BrianH 9-Feb-2009 [10902] | Of course FOREACH of map! would operate in the order that TO-BLOCK map! would return the keys and values at that moment. In the long run you would have to consider the order of FOREACH map! to be non-deterministic between calls. The map! type has no inherent ordering, so position and sorting are meaningless for it. |
Pavel 9-Feb-2009 [10903] | hashed doesn't mean ordered? |
BrianH 9-Feb-2009 [10904x2] | It doesn't. SELECT works on object! and map!, but there is no comparison except equality for those types. |
Hashed means indexed (in the database sense), not ordered. | |
Pavel 9-Feb-2009 [10906x2] | my fault I missmatch rebol select with SQL like select |
IE if you expect quite large number of keys would you have any chance to "narrow" like "sql between" | |
BrianH 9-Feb-2009 [10908] | Map! is not indexed in the REBOL sense, ironically enough: no position. |
Pavel 9-Feb-2009 [10909] | OK now I have more clue, all this is toward key/value datastore preferably diskbased something I believe Paul is trying in R3 |
BrianH 9-Feb-2009 [10910x2] | REBOL is a lower-level language than SQL. No set operations (for map!, ar least). Those kinds of SQL operations need to be done procedurally in REBOL, using block copies and such. |
We will have REBOL Indexed Files (RIF) for the disk-based datastore. | |
Pavel 9-Feb-2009 [10912] | I'm really currious believe me, like small boy |
BrianH 9-Feb-2009 [10913] | Well, we don't havee RIF yet so you'll have to stay curious for a while :( |
Pavel 9-Feb-2009 [10914x2] | I'm keeping finger crossed not to be too old to be able enjoy truly |
But seriously thanks for all the job is done until now | |
Steeve 9-Feb-2009 [10916] | hmmmm.... interesting behaviour of blocks.... Brian, does that mean that Carl had in main a possibly new feature asked for a while: RANGE :A reference which is a sub part of an existing serie. (supress the need of overheaded copy/part in our sripts) I think it's not at all tricky to implement if the head of a serie is a logical offset now. |
older newer | first last |