Well, "I" means unsigned int with some variability in size.. But no matter..if these scores are that big (>=4 bytes), then why even bother with pack()? Pass around something (update: "something" here means pointer to a hunk of memory) that is X x Y ints big which is what I suggest even if the scores are as small as 8 bits.
I am also challenging the need for 'C' in the first place. There may some false assumption about Perl math performance. Yes, Perl is far slower than 'C', but its not 20x slower and actually does surprisingly well on "int" operations.
Update: I see how I got onto this "char" idea, it was from the byte_stream name and I remembered the "byte" part. Continuing on with this "compact" requirement...let's say we have 1 million 1 byte integers. That takes 4MB on my 32 bit machine. What will happen if we "pack" that? It will take even MORE memory! pack() will not overwrite the original 4MB and will use 1MB more for the "packed" version. The percentage growth in memory usage is even worse if these are 16 bit integers. As far as speed goes, there are some complex "yeah but's" that depend upon how good your memory sub-system is. However it is hard for me to imagine how "packing" could work out well.
In short: if you have a memory structure that you want to send to some sub(), "packing" is literally a waste of time and memory. Send a pointer to the memory structure that you already have. In general (I don't know a case where this is not true) your Perl environment will have the same understanding as your 'C' environment regarding how big an "int" is...32 or 64 bits. The 16,24,48 bit systems have gone the way of the dodo bird. | [reply] |
why even bother with pack()? Pass around something(... a hunk of memory) that is X x Y ints big
That is exactly what he is doing! He's also choosen to initialise it to zeros.
He could also have done that without using pack, say my $buf = chr(0) x ( $x_dimension * $y_dimension * 4 ), but that would then fail if the code is ever ported to a system where the C compiler ints are 64-bit. The way he has choesen to perform the initialisation makes it quite clear what memory represents. A good choice I think.
I am also challenging the need for 'C' in the first place.
You must have a crystal ball then, because I do not see enough information in the OP to give me the confidence to raise such a challenge.
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] [d/l] [select] |
my $buf = (0) x ( $x_dimension x $y_dimension);
I guess my english is not good enough. Perhaps I should have used "question" instead of "challenge". Sorry if the aggressive tone offended..certainly not my intent. But this is a valid query. The more information provided, the better the result from Monks. | [reply] [d/l] |