axis-c-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Samisa Abeysinghe <>
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
slower than LibWWW based implementation I did some measurers on the speed with echo string
of base sample.
   The original Axis transport lib was much slower and hence I implemented a new socket based
transport lib with the logic similar to current Axis transport. The results are interesting.
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
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.
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
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
thread safe as it is too slow. We have to remove the globle variables from the code and see
this thread safety problems would persist. We must look into thread safety as an immediate
priority issue.

    As the code is frozen at the moment for 1.3 I did not commit the new trasport. It works
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

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


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

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

#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;

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


	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 <<

	InteropTestPortType ws (endpoint);


        // 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(
startTime ) );

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

        // Clean memory 
        if (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;

    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)

    return 0;


Do you Yahoo!?
Declare Yourself - Register online to vote today!
View raw message