Re: Why I need to use C for screen graphics

new topic     » goto parent     » topic index » view thread      » older message » newer message

Andrew Katz wrote:
> 
> I would love to have my application be 100% Euphoria, since it claims to be
> such a fast language. However, I have to do some work in C because Euphoria
> is too slow. Euphoria is okay most of the time. But here is an example where
> compiled C is 20 times faster. I wrote a test case to prove it.
> }}}
<eucode>
> --  code generated by Win32Lib IDE v1.0.0 Build Apr-26-2007
> 
> constant TheProgramType="exw" 
>  
> include Win32Lib.ew
> without warning
> 
>
> --------------------------------------------------------------------------------
> --  Window Window1
> constant Window1 = createEx( Window, "Test to compare Euphoria and C
> graphics", 0, Default, Default, 800,
> 600, 0, 0 )
> constant DRAWIN = createEx( Window, "", Window1, 152, 0, 510, 510, {WS_CHILD,
> WS_CLIPSIBLINGS, WS_DLGFRAME},
> {WS_EX_CLIENTEDGE, WS_EX_STATICEDGE} )
> openWindow(DRAWIN, Normal)
> moveZOrder( DRAWIN, HWND_TOP)
> setWindowBackColor( DRAWIN,16777215 )
> constant RUNE = createEx( PushButton, "RUN Euphoria", Window1, 28, 28, 88, 28,
> 0, 0 )
> constant RUNC = createEx( PushButton, "Run C", Window1, 28, 68, 88, 28, 0, 0 )
> ---------------------------------------------------------
>
> --------------------------------------------------------------------------------
> include dll.e -- this is for calling draw_magic in C
> include machine.e -- this is for the container to pass to C a structure
> 
> constant backcolor = #FFFFFF -- white
> 
> atom draw_dll
> integer draw_C -- C routine handle for Euphoria
> 
> draw_dll = open_dll ("DRAWtest.dll")
> draw_C = define_c_proc (draw_dll, "_draw_test@4", {C_UINT})
> -- in C this would be: VOID draw_test(HDC hDC)
> -- assume device context is a UINT and draw_test has the form Watcom created
> in the DLL.
> if draw_C = -1 then
>     abortErr(  "Draw function not found" )
> end if
> 
>
> --------------------------------------------------------------------------------
> procedure RUNE_onClick (integer self, integer event, sequence params)--params
> is ()
> -- run Euphoria drawing
> 
> integer x,y
> atom t0
> integer MsgBox
> t0 = time()
> 
> setWindowBackColor( DRAWIN, backcolor )
> setPenMode( DRAWIN, R2_COPYPEN )
> setPenColor( DRAWIN, 0 )
> 
> set_rand(1500)
> for i=1 to 100000 do
> 	x = rand(500)
> 	y = rand(500)
> 	drawLine ( DRAWIN, x, y, x, y+2 )
> end for
> 
> MsgBox = message_box(sprintf("Took %f time",{time()-t0}),"Test Euphoria", #0)
> 
> end procedure
> setHandler( RUNE, w32HClick, routine_id("RUNE_onClick"))
>
> --------------------------------------------------------------------------------
> procedure RUNC_onClick (integer self, integer event, sequence params)--params
> is ()
> -- Run the C test
> 
> atom hDC
> 
> atom t0
> integer MsgBox
> t0 = time()
> 
> setWindowBackColor( DRAWIN, backcolor )
> hDC = getDC (DRAWIN)
> c_proc (draw_C, {hDC})
> releaseDC (hDC)
> 
> MsgBox = message_box(sprintf("Took %f time",{time()-t0}),"Test C", #0)
> 
> end procedure
> setHandler( RUNC, w32HClick, routine_id("RUNC_onClick"))
> 
> 
> WinMain( Window1,Normal )
> </eucode>
{{{

> 
> C code: (I wonder how it is going to look inside of eucode tags)
> }}}
<eucode>
> #define STRICT
> #include <math.h>
> #include <windows.h>
> #include <stdlib.h>
> 
> VOID __stdcall __export draw_test(HDC hDC)
> {
> 	int i,x,y;
> 
> 	HPEN hcolorpen;
> 	hcolorpen = CreatePen(PS_SOLID,0,0);
> 	SetROP2(hDC, R2_COPYPEN);   // drawing mode
> 	SelectObject(hDC,hcolorpen);
> 
> 	srand(1500);
> 	for (i=0; i<100000; i++)
> 	{
> 		x = rand()%500;
> 		y = rand()%500;
> 		MoveToEx( hDC, x, y, NULL );
> 		LineTo( hDC, x, y+2 );
> 	}
> 
> 	DeleteObject(hcolorpen);
> }
> </eucode>
{{{

> 
> Andy Katz
> B.S. Computer Science, 1978
> Rensselaer Polytechnic Institute (RPI)

I ran your code and get:

F:\eu\WIN32LIB\w32msgs.e:112 in procedure fShowError() 
attempt to divide by 0 
    pParams = "Draw function not found"
    pMode = 2
    lErrCode = 0
    lResponse = 1
    lStyle = 16
    s = "Draw function not found"
    lDispMsg = "Draw function not found\n\nWin32Lib v0.60.6 11-Jul-2004"
    lTitle = "Win32Lib AppWindow - Fatal Error"

... called from F:\eu\WIN32LIB\w32msgs.e:145 in procedure abortErr()  
    pParams = "Draw function not found"

... called from F:\euNFL06\test.exw:36 

Line 36 being this line:

abortErr(  "Draw function not found" )

What am I doing wrong?


Don Cole

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu