diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2011-04-12 20:30:29 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2011-04-12 20:30:29 +0000 |
commit | a7780dff310fc13406f09fd6d2099b98aa418968 (patch) | |
tree | 1e42da5e05bb54eaf8f4a5223584ee8dea6ddbaf | |
parent | 3a451e9d58e8f6a91a580ba8cd722efaa58825ad (diff) | |
download | ATCD-a7780dff310fc13406f09fd6d2099b98aa418968.tar.gz |
Tue Apr 12 20:11:30 UTC 2011 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | performance-tests/Alt_Mapping/StringMember/StringMember.idl | 18 | ||||
-rw-r--r-- | performance-tests/Alt_Mapping/StringMember/StringMember.mpc | 103 | ||||
-rw-r--r-- | performance-tests/Alt_Mapping/StringMember/client.cpp | 145 | ||||
-rw-r--r-- | performance-tests/Alt_Mapping/StringMember/run_test.pl | 98 | ||||
-rw-r--r-- | performance-tests/Alt_Mapping/StringMember/server.cpp | 98 |
6 files changed, 471 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index b717a391a5b..cde4c1ee135 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Tue Apr 12 20:11:30 UTC 2011 Jeff Parsons <j.parsons@vanderbilt.edu> + + * performance-tests/Alt_Mapping/StringMember/*.*: + + New test, measures latency of a CORBA operation sending a + struct with a string member, in two versions - when the + string member in question is assigned with a copy and + without a copy. + Fri Apr 8 20:49:40 UTC 2011 Jeff Parsons <j.parsons@vanderbilt.edu> * tests/Alt_Mapping/Options.cpp: diff --git a/performance-tests/Alt_Mapping/StringMember/StringMember.idl b/performance-tests/Alt_Mapping/StringMember/StringMember.idl new file mode 100644 index 00000000000..6e9231930f5 --- /dev/null +++ b/performance-tests/Alt_Mapping/StringMember/StringMember.idl @@ -0,0 +1,18 @@ +// $Id$ + +#ifndef STRINGMEMBER_IDL +#define STRINGMEMBER_IDL + +struct Foo +{ + string strmem; +}; + +interface Test +{ + void test_op (in Foo inarg); + + void shutdown (); +}; + +#endif // STRINGMEMBER_IDL diff --git a/performance-tests/Alt_Mapping/StringMember/StringMember.mpc b/performance-tests/Alt_Mapping/StringMember/StringMember.mpc new file mode 100644 index 00000000000..cc7af5296f7 --- /dev/null +++ b/performance-tests/Alt_Mapping/StringMember/StringMember.mpc @@ -0,0 +1,103 @@ +// -*- MPC -*- +// $Id$ + +project(*idl): taoidldefaults { + IDL_Files { + idlflags -= -Sa -St + idlflags += -Wb,stub_export_macro=STRING_MEMBER_STUB_Export \ + -Wb,stub_export_include=string_member_stub_export.h \ + -Wb,skel_export_macro=STRING_MEMBER_SKEL_Export \ + -Wb,skel_export_include=string_member_skel_export.h \ + -Gxhst -Gxhsk -Gstl + + StringMember.idl + } + + custom_only = 1 +} + +project(*Stub): taolib, anytypecode, codeset, avoids_minimum_corba, avoids_ace_for_tao { + after += *idl + sharedname = String_Member_Stub + dynamicflags += STRING_MEMBER_STUB_BUILD_DLL + + IDL_Files { + } + + Source_Files { + StringMemberC.cpp + } + + Inline_Files { + StringMemberC.inl + } + + Header_Files { + StringMemberC.h + string_member_stub_export.h + } +} + +project(*Client): taoexe, codeset { + exename = client + after += *Stub + libs += String_Member_Stub + + IDL_Files { + } + + Source_Files { + client.cpp + } + + Header_Files { + } + + Inline_Files { + } +} + +project(*Skel): portableserver, codeset, avoids_minimum_corba, avoids_corba_e_compact, avoids_corba_e_micro { + after += *Stub + sharedname = String_Member_Skel + libs += String_Member_Stub + dynamicflags += STRING_MEMBER_SKEL_BUILD_DLL + + IDL_Files { + } + + Source_Files { + StringMemberS.cpp + } + + Inline_Files { + StringMemberS.inl + } + + Header_Files { + StringMemberS.h + string_member_skel_export.h + } +} + +project(*Server): taoexe, codeset, portableserver { + exename = server + after += *Skel + libs += String_Member_Skel String_Member_Stub + + IDL_Files { + } + + Source_Files { + server.cpp + } + + Header_Files { + } + + Inline_Files { + } +} + + + diff --git a/performance-tests/Alt_Mapping/StringMember/client.cpp b/performance-tests/Alt_Mapping/StringMember/client.cpp new file mode 100644 index 00000000000..3a89abf76fd --- /dev/null +++ b/performance-tests/Alt_Mapping/StringMember/client.cpp @@ -0,0 +1,145 @@ +// $Id$ + +//======================================================================== +// +// = FILENAME +// client.cpp +// +// = DESCRIPTION +// This is the driver program that compares copy and non-copy performance +// of arg string member assignment from std::string. +// +// = AUTHOR +// Jeff Parsons <j.parsons@vanderbilt.edu> +// +//========================================================================= + +#include "ace/High_Res_Timer.h" +#include "ace/Basic_Stats.h" +#include "ace/Sample_History.h" +#include "ace/OS_NS_ctype.h" +#include "ace/Get_Opt.h" + +#include "StringMemberC.h" + +const char *ior_file = "file://StringMember.ior"; +int niterations = 10000; +CORBA::ULong len = 40; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("n:l:")); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'n': + niterations = ACE_OS::atoi (get_opts.opt_arg ()); + break; + case 'l': + len = ACE_OS::atoi (get_opts.opt_arg ()); + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s " + "-n <iterations> " + "-l <string length> " + "\n", + argv [0]), + -1); + } + // Indicates sucessful parsing of the command line + return 0; +} + +char * +gen_string (void) +{ + char *buf = CORBA::string_alloc (len); + CORBA::ULong i = 0; + + while (i < len) + { + int c = ACE_OS::rand () % 128; + + if (ACE_OS::ace_isprint (c) && !ACE_OS::ace_isspace (c)) + { + buf [i] = c; + i++; + } + } + + buf[i] = 0; + return buf; +} + +int +ACE_TMAIN (int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); + + CORBA::Object_var obj = orb->string_to_object (ior_file); + + Test_var target = Test::_narrow (obj.in ()); + + if (parse_args (argc, argv) != 0) + { + return 1; + } + + CORBA::String_var str = gen_string (); + std::string data (str.in ()); + + Foo arg; + + ACE_Sample_History no_copy_history (niterations); + + for (int i = 0; i < niterations; ++i) + { + ACE_hrtime_t start = ACE_OS::gethrtime (); + arg.strmem = data; + target->test_op (arg); + ACE_hrtime_t now = ACE_OS::gethrtime (); + no_copy_history.sample (now - start); + } + + ACE_UINT32 gsf = ACE_High_Res_Timer::global_scale_factor (); + ACE_Basic_Stats no_copy_stats; + no_copy_history.collect_basic_stats (no_copy_stats); + no_copy_stats.dump_results (ACE_TEXT ("No Copy"), gsf); + + ACE_Sample_History copy_history (niterations); + + for (int i = 0; i < niterations; ++i) + { + ACE_hrtime_t start = ACE_OS::gethrtime (); + arg.strmem = data.c_str (); + target->test_op (arg); + ACE_hrtime_t now = ACE_OS::gethrtime (); + copy_history.sample (now - start); + } + + ACE_Basic_Stats copy_stats; + copy_history.collect_basic_stats (copy_stats); + copy_stats.dump_results (ACE_TEXT ("Copy"), gsf); + +// target->shutdown (); + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ("client: CORBA Exception caught"); + return -1; + } + catch (...) + { + ACE_ERROR_RETURN ((LM_ERROR, "client: unknown exception caught\n"), + -1); + } + + return 0; +} diff --git a/performance-tests/Alt_Mapping/StringMember/run_test.pl b/performance-tests/Alt_Mapping/StringMember/run_test.pl new file mode 100644 index 00000000000..03c0b93676e --- /dev/null +++ b/performance-tests/Alt_Mapping/StringMember/run_test.pl @@ -0,0 +1,98 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +use lib "$ENV{ACE_ROOT}/bin"; +use PerlACE::TestTarget; + +my $server = PerlACE::TestTarget::create_target(1) || die "Create target 1 failed\n"; +my $client = PerlACE::TestTarget::create_target(2) || die "Create target 2 failed\n"; + +$iorbase = "StringMember.ior"; +my $server_iorfile = $server->LocalFile ($iorbase); +my $client_iorfile = $client->LocalFile ($iorbase); +$server->DeleteFile($iorbase); +$client->DeleteFile($iorbase); + +$num = 10000; +$len = 40; +$status = 0; + +# Parse the arguments + +for ($i = 0; $i <= $#ARGV; $i++) { + if ($ARGV[$i] eq "-h" || $ARGV[$i] eq "-?") { + print "Run_Test Perl script for TAO StringMember Test\n\n"; + print "run_test [-n num] [-l length]\n"; + print "\n"; + print "-n num -- num iterations for stats\n"; + print "-l length -- string member length\n"; + exit 0; + } + elsif ($ARGV[$i] eq "-n") { + $num = $ARGV[$i + 1]; + $i++; + } + elsif ($ARGV[$i] eq "-l") { + $len = $ARGV[$i + 1]; + $i++; + } +} + +$SV = $server->CreateProcess ("server"); +$CL = $client->CreateProcess ("client"); + +$server->DeleteFile($iorbase); # Ignore errors +$client->DeleteFile($iorbase); + +$server_status = $SV->Spawn (); + +if ($server_status != 0) { + print STDERR "ERROR: server returned $server_status\n"; + $status = 1; +} else { + if ($server->WaitForFileTimed ($iorbase, + $server->ProcessStartWaitInterval()) == -1) { + print STDERR "ERROR: cannot find file <$server_iorfile>\n"; + $SV->Kill (); + exit 1; + } + + if ($server->GetFile ($iorbase) == -1) { + print STDERR "ERROR: cannot retrieve file <$server_iorfile>\n"; + $SV->Kill (); $SV->TimedWait (1); + exit 1; + } + if ($client->PutFile ($iorbase) == -1) { + print STDERR "ERROR: cannot set file <$client_iorfile>\n"; + $SV->Kill (); $SV->TimedWait (1); + exit 1; + } + + $CL->Arguments ("-n $num -l $len"); + $client_status = $CL->SpawnWaitKill ($server->ProcessStartWaitInterval() + 45); + + if ($client_status != 0) { + print STDERR "ERROR: client returned $client_status\n"; + $status = 1; + } + + $server_status = $SV->Kill (); + + if ($server_status != 0) { + print STDERR "ERROR: server returned $server_status\n"; + $status = 1; + } + + $server->GetStderrLog(); + + $server->DeleteFile($iorbase); + $client->DeleteFile($iorbase); +} + +$server->DeleteFile($iorbase); + +exit $status; diff --git a/performance-tests/Alt_Mapping/StringMember/server.cpp b/performance-tests/Alt_Mapping/StringMember/server.cpp new file mode 100644 index 00000000000..9f3b2c07402 --- /dev/null +++ b/performance-tests/Alt_Mapping/StringMember/server.cpp @@ -0,0 +1,98 @@ +// $Id$ + +// ============================================================================ +// +// = FILENAME +// server.cpp +// +// = DESCRIPTION +// The server process for the StringMember test +// +// = AUTHOR +// Jeff Parsons <j.parsons@vanderbilt.edu> +// +// ============================================================================ + +#include "ace/OS_NS_stdio.h" + +#include "StringMemberS.h" + +const char *ior_file = "StringMember.ior"; + +class Test_i : public virtual POA_Test +{ +public: + Test_i (CORBA::ORB_ptr orb) + : orb_ (orb) + { + } + + virtual void + test_op (const Foo & /* inarg */) + { + } + + virtual void + shutdown (void) + { + this->orb_->shutdown (false); + } + +private: + CORBA::ORB_ptr orb_; +}; + +int +ACE_TMAIN (int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); + + CORBA::Object_var obj = + orb->resolve_initial_references ("RootPOA"); + + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (obj.in ()); + + PortableServer::POAManager_var poa_manager = + root_poa->the_POAManager (); + + poa_manager->activate (); + + Test_i servant (orb.in ()); + Test_var objref = servant._this (); + + CORBA::String_var ior = orb->object_to_string (objref.in ()); + + FILE *output_file= ACE_OS::fopen (ior_file, "w"); + + if (output_file == 0) + { + ACE_ERROR ((LM_ERROR, + "Cannot open output file for writing IOR: %s", + ior_file)); + return -1; + } + + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + + orb->run (); + + root_poa->destroy (false, false); + orb->destroy (); + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ("server: CORBA Exception caught"); + return -1; + } + catch (...) + { + ACE_ERROR_RETURN ((LM_ERROR, "server: unknown exception caught\n"), + -1); + } + + return 0; +} |