Is there a quick way to determine if a memoryblock of a million bytes contains ONLY chrb(0) s?
One way, which seems to work, (hopefully it is comparing the contents not the address…)
dim empt as new MemoryBlock(1000 * 1000)
if empt <> theothermemoryblock then
//stuff
end if
That allocates a memory block just for compare.
At least make it a static variable, so you only do it first time.
in MBS Plugin we have a function to check for all zero:
MemoryBlock.BytesZeroMBS(srcOfs as Integer, numBytes as Integer) as Boolean
Excellent.
I was hoping you did, but I couldn’t find anything in the help
I did some testing using three techniques:
- Create a new MemoryBlock and compare to original.
- Store an empty MemoryBlock via Static and compare to original.
- Iterate over the MemoryBlock using a Ptr.
I ran each method 5 times against an empty MemoryBlock, then 5 times against one where only the last byte was set to 1.
Using the Ptr technique was about 10 times faster than the others, about 0.75 ms vs. 7.5 ms (give or take).
Here is the function for your reference:
Public Function IsZero3(mb As MemoryBlock) As Boolean
#if not DebugBuild
#pragma BackgroundTasks false
#pragma BoundsChecking false
#pragma NilObjectChecking false
#pragma StackOverflowChecking false
#endif
if mb.Size = 0 then
return true
end if
const kZero as UInt64 = 0
var p as ptr = mb
if mb.Size >= 8 then
var lastInt64Index as integer = ( mb.Size - 8 ) \ 8 * 8
var currentIndex as integer
while currentIndex <= lastInt64Index
if p.UInt64( currentIndex ) <> kZero then
return false
end if
currentIndex = currentIndex + 8
wend
end if
var lastIndex as integer = mb.Size - 1
var firstIndex as integer = mb.Size - ( mb.Size mod 8 )
for currentIndex as integer = firstIndex to lastIndex
if p.Byte( currentIndex ) <> 0 then
return false
end if
next
return true
End Function
Surprisingly, that function is faster than the MBS function too. (4-5 ms for MBS).
Note that the test app was compiled using Aggressive.
Send me your test project and I can see what I can do.
Don’t worry about me… I was only looking for something that didn’t do 1 million compares.
All the solutions provided here are easily fast enough for my needs.
Thanks!
Is a while loop faster than a for loop with a step of eight?
No measurable difference in my test.
Okay, in my test plugin was 42ms and now is 7ms.
Doing it in 64-bit chunks is faster and no idea why I didn’t do that last time.