axis-c-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Samisa Abeysinghe <samisa_abeysin...@yahoo.com>
Subject Analysis of Axis C++ client transport
Date Fri, 17 Sep 2004 08:39:06 GMT
Hi All,
    Since I was under the impression that the current Axis transport lib implementation is
much
slower than LibWWW based implementation I did some measurers on the speed with echo string
method
of base sample.
   The original Axis transport lib was much slower and hence I implemented a new socket based
Axis
transport lib with the logic similar to current Axis transport. The results are interesting.
The
original Axis transport implementation is too slow, and not only that, it cannot send messages
lager than 48800 (strage number), if I try to the client segfaults. The new transport lib
as well
as the LibWWW based transport can send much larger messages (I tested upto 2621440 characters)
   The other interesting thing is that the new trasport that I implemented are faster than
LibWWW
based implementation.
    Please have a look at the attached HTML file for results.

    At the moment, the Call class creates a new transport object for each and every invcation.
I
made the code to reuse the same transport and the code became still faster.

    However, testing for thread safety, both LibWWW and the new transport failed, only the
old
trasport work with threads. I am doubtful of this, because in the new transport I have very
similar logic to that of the old (but not the same) I doubt the old transport pretends to
be
thread safe as it is too slow. We have to remove the globle variables from the code and see
if
this thread safety problems would persist. We must look into thread safety as an immediate
high
priority issue.

    As the code is frozen at the moment for 1.3 I did not commit the new trasport. It works
for
chunks as well, however it would have to be tested more to be used in production envioronments.
Hence, even if I put it in cvs, I would like it to be seperate from the original Axis transport
lib. I have removed all cyclic couplings in this new code and hence it would be easier to
maintain.

    I have given below the client code that I used for this testing (with base.wsdl generated
code)

Thanks,
Samisa...

#include <string>
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/timeb.h>

#ifdef WIN32
#else
#include <sys/times.h>
#include <unistd.h>
#endif


#include <axis/AxisGenException.h>
#include "./gen_src/InteropTestPortType.h"

using namespace std;

#define STRING_TO_SEND "HelloWorld"

static void
usage (char *programName, char *defaultURL)
{
    cout << "\nUsage:\n"
	<< programName << " [-? | service_url] " << endl
	<< "    -?             Show this help.\n"
	<< "    service_url    URL of the service.\n"
	<< "    Default service URL is assumed to be " << defaultURL
	<<
	"\n    Could use http://localhost:8080/axis/services/echo to test with Axis Java."
	<< endl;
}


int
main (int argc, char *argv[])
{
    int length = 10;
    char endpoint[256];

    // Set default service URL
    sprintf (endpoint, "http://localhost/axis/base");
    // Could use http://localhost:8080/axis/services/echo to test with Axis Java

    try
    {

	if (argc > 1)
	{
	    // Watch for special case help request
	    if (!strncmp (argv[1], "-", 1)) // Check for - only so that it works for 
                                            //-?, -h or --help; -anything 
	    {
		usage (argv[0], endpoint);
		return 2;
	    }
	    length = atoi(argv[1]);
	}
        
        if (argc > 2)
            sprintf (endpoint, argv[2]);

	cout << endl << " Using service at " << endpoint << endl <<
endl;

	InteropTestPortType ws (endpoint);

        ws.setTransportTimeout(2);

        // Prepare the string to be sent 
        char* buffer = new char[ length * strlen(STRING_TO_SEND) + 1];
        buffer[0] = '\0';
        for (int i = 0; i < length; i++ )
            strcat(buffer, STRING_TO_SEND);
	
	// Time mesurement stuff
	time_t startTime;
        time_t endTime;

	time( &startTime );

        char* echoStringResult = ws.echoString(buffer);

	time( &endTime );
        printf( "Time spent to invoke method ws.echoString(buffer); = %lf s\n", difftime(
endTime,
startTime ) );

	if (0 == strcmp(echoStringResult, buffer))
	    printf ("successful\n");
	else
	    printf ("failed\n");

        // Clean memory 
        if (echoStringResult)
            free(echoStringResult);

        delete [] buffer;

    }
    catch (AxisException & e)
    {
	printf ("Exception : %s\n", e.what ());
    }
    catch (exception & e)
    {
	printf ("Unknown exception has occured\n");
    }
    catch (...)
    {
	printf ("Unknown exception has occured\n");
    }

    // System vs User time stuff
#ifdef WIN32
#else // Linux/Unix
    tms timesSpent;
    times(&timesSpent);

    printf( "User time               = %ld clock ticks\n", timesSpent.tms_utime );
    printf( "System time             = %ld clock ticks\n", timesSpent.tms_stime);
    printf( "User time of children   = %ld clock ticks\n", timesSpent.tms_cutime);
    printf( "System time of children = %ld clock ticks\n", timesSpent.tms_cstime);
    printf( "Processor time used     = %ld clock ticks\n", clock());
    printf( "Number of clock ticks per second = %ld clock ticks/s\n", sysconf(_SC_CLK_TCK)
);
#endif

    return 0;
}

        


		
_______________________________
Do you Yahoo!?
Declare Yourself - Register online to vote today!
http://vote.yahoo.com
Mime
View raw message