I just tried rerunning the test but with all the contents of the inner loop
commented out -
So in the RB PTR case:
dim u as integer = Count * 4
for j as integer = 0 to iterations
for i as integer = 0 to u step 4
// pB.Single(i) = pA.Single(i)
Next
Next
And in C dylib:
void copySingle (int count, float * A, float * B ) {
int i;
for ( i = 0; i < count ; i++ ) {
// B[i] = A[i];
}
};
The C dylib version went down to around 2 seconds ( I think it was less )
While the RB version is around 19 seconds.
On 16/5/07 02:21, "Daniel Stenning" <[EMAIL PROTECTED]> wrote:
> Heres a simple test I did which creates simply copies 44100 floats from one
> memoryblock to another. It does this 3000 times in order to allow timing to
> be done.
>
> I did this initially to see if there is a significant performance gain from
> using Ptr pointers to the memoryblocks to do the reads and copies, versus
> using the memoryblock SingleValue() methods.
>
> Indeed there is. Using Ptr is faster.
>
> But out of curiosity I thought I'd see how near the performance was compared
> to doing the core copy operation in C - using a dylib. So I wrote a quick
> dylib with a single function:
>
> void copySingle (int count, float * A, float * B ) {
> int i;
> for ( i = 0; i < count ; i++ ) {
> B[i] = A[i];
> }
> };
>
>
> And then via a declare called this function 3000 times. ( passing 3000 as
> the count argument )
>
> The time taken in RB using Ptr: around 45 seconds
> And in by calling the C dylib ? : 5 seconds.
>
> This is on a G4 PowerBook.
>
> I was NOT expecting that, and that 45 second timing was even after using
> pragmas to reduce overheads.
>
> I was expecting RB to be a little slower than C but not THAT much slower.
> After all - RB is supposed to be natively compiled - thus comparable to C.
>
> Here is the code for the RB version:
> ****************************************************************
>
> #pragma DisableAutoWaitCursor
> #pragma DisableBackgroundTasks
> #pragma DisableBoundsChecking
> #pragma StackOverflowChecking false
>
> Dim Count As integer = 44100 -1
> DIm iterations as integer = 3000
>
> // source buffer
> Dim A as new MemoryBlock( 44100 * 4)
>
> // stuff A with incrementing single values
> for i as integer = 0 to Count
> A.SingleValue(i*4) = i
> Next
>
> // target buffer
> Dim B as new MemoryBlock( 44100 * 4)
>
> // use pointers for speed
> dim pA As Ptr = A
> dim pB as Ptr = B
>
> Result.Text = "Started"
> app.DoEvents
>
> dim u as integer = Count * 4
> for j as integer = 0 to iterations
> for i as integer = 0 to u step 4
> pB.Single(i) = pA.Single(i)
> Next
> Next
>
> Beep
>
> Result.Text= "FINISHED"
>
> *************************************
> And here is the version that calls the C function in the dylib:
>
>
> soft Declare Sub copySingle Lib LIBPATH ( c as integer, ptA as Ptr, ptB
> as Ptr )
>
> Dim Count As integer = 44100
> DIm iterations as integer = 3000
>
> Dim A as new MemoryBlock( 44100 * 4)
>
> // stuff A with incrementing single values
> for i as integer = 0 to Count-1
> A.SingleValue(i*4) = i
> Next
>
> Dim B as new MemoryBlock( 44100 * 4)
>
> dim pA As Ptr = A
> dim pB as Ptr = B
>
> Result.Text = "Started"
> app.DoEvents
>
> dim u as integer = Count
> for j as integer = 0 to iterations
> copySingle( u, pA, pB )
> Next
>
> Beep
> Result.Text= "FINISHED"
>
>
>
> So - here is the 40 million dollar question - WHY is RB nearly 10 times
> slower than C ?
> Is this something that can and should be adressed by RS ?
>
>
> _______________________________________________
> Unsubscribe or switch delivery mode:
> <http://www.realsoftware.com/support/listmanager/>
>
> Search the archives:
> <http://support.realsoftware.com/listarchives/lists.html>
>
Regards,
Dan
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives:
<http://support.realsoftware.com/listarchives/lists.html>