summaryrefslogtreecommitdiff
path: root/TAO/tests/OctetSeq/OctetSeq.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/OctetSeq/OctetSeq.cpp')
-rw-r--r--TAO/tests/OctetSeq/OctetSeq.cpp253
1 files changed, 253 insertions, 0 deletions
diff --git a/TAO/tests/OctetSeq/OctetSeq.cpp b/TAO/tests/OctetSeq/OctetSeq.cpp
new file mode 100644
index 00000000000..97bb5c276d9
--- /dev/null
+++ b/TAO/tests/OctetSeq/OctetSeq.cpp
@@ -0,0 +1,253 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/tests/OctetSeq
+//
+// = FILENAME
+// octetseq.cpp
+//
+// = DESCRIPTION
+// TAO optimizes octet sequences, this test verifies that the
+// optimizations do not break any code and that they effectively
+// improve performance.
+//
+// = AUTHORS
+// Carlos O'Ryan
+//
+// ============================================================================
+
+#include "ace/Get_Opt.h"
+#include "ace/High_Res_Timer.h"
+
+#include "tao/ORB.h"
+#include "tao/CDR.h"
+#include "testC.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID(OctetSeq, OctetSeq, "$Id$")
+
+static int
+test_write_octet (TAO_OutputCDR &cdr,
+ char* /* buf */,
+ size_t bufsize)
+{
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ ACE_Message_Block mb (/* buf, */ bufsize);
+ mb.wr_ptr (bufsize);
+ Test::OctetSeq os (bufsize, &mb);
+#else
+ Test::OctetSeq os (bufsize);
+ os.length (bufsize);
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+
+ if ((cdr << os) == 0)
+ return -1;
+ return 0;
+}
+
+static int
+test_read_octet (TAO_InputCDR &cdr,
+ char* /* buf */,
+ size_t /* bufsize */)
+{
+ Test::OctetSeq os;
+
+ if ((cdr >> os) == 0)
+ return -1;
+ return 0;
+}
+
+static int
+test_write_char (TAO_OutputCDR &cdr,
+ char* buf,
+ size_t bufsize)
+{
+ Test::CharSeq cs (bufsize, bufsize, buf);
+
+ if ((cdr << cs) == 0)
+ return -1;
+ return 0;
+}
+
+static int
+test_read_char (TAO_InputCDR &cdr,
+ char* /* buf */,
+ size_t /* bufsize */)
+{
+ Test::CharSeq cs;
+
+ if ((cdr >> cs) == 0)
+ return -1;
+ return 0;
+}
+
+typedef
+int (*Writer)(TAO_OutputCDR& cdr,
+ char* buf, size_t bufsize);
+typedef
+int (*Reader)(TAO_InputCDR& cdr,
+ char* buf, size_t bufsize);
+
+int
+run (char* buf, size_t bufsize,
+ size_t n, size_t lo, size_t s,
+ int quiet,
+ const char* name,
+ Writer writer, Reader reader)
+{
+ size_t count = 0;
+ double sum_read = 0;
+ double sum_write = 0;
+
+ for (size_t x = lo; x <= bufsize; x += s)
+ {
+ ACE_High_Res_Timer writing;
+ ACE_High_Res_Timer reading;
+
+ for (size_t i = 0; i < n; ++i)
+ {
+ writing.start_incr ();
+ TAO_OutputCDR output;
+
+ if (writer (output, buf, x) != 0)
+ return -1;
+ writing.stop_incr ();
+
+ TAO_InputCDR input (output);
+ reading.start_incr ();
+ if (reader (input, buf, x) != 0)
+ return -1;
+ reading.stop_incr ();
+ }
+
+ double m = n;
+
+ ACE_Time_Value wtv;
+ writing.elapsed_time_incr (wtv);
+ ACE_hrtime_t wusecs = wtv.sec ();
+ wusecs *= static_cast<ACE_UINT32> (ACE_ONE_SECOND_IN_USECS);
+ wusecs += wtv.usec ();
+
+ ACE_Time_Value rtv;
+ reading.elapsed_time_incr (rtv);
+ ACE_hrtime_t rusecs = rtv.sec ();
+ rusecs *= static_cast<ACE_UINT32> (ACE_ONE_SECOND_IN_USECS);
+ rusecs += rtv.usec ();
+
+ double write_average = ACE_HRTIME_CONVERSION(wusecs) / m;
+ double read_average = ACE_HRTIME_CONVERSION(rusecs) / m;
+
+ count++;
+ sum_read += read_average;
+ sum_write += write_average;
+ if (quiet == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "%s: %d %.3f %.3f\n",
+ name, x, write_average, read_average));
+ }
+ }
+
+ if (count != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "%s total: %.3f %.3f\n",
+ name, sum_write / count, sum_read / count));
+ }
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ try
+ {
+ CORBA::ORB_var orb = CORBA::ORB_init (argc,
+ argv,
+ 0);
+
+ int n = 64;
+ int lo = 128;
+ int hi = 65536;
+ int s = 32;
+
+ int quiet = 0;
+
+ ACE_Get_Opt get_opt (argc, argv, "qn:l:h:s:");
+ int opt;
+
+ while ((opt = get_opt ()) != EOF)
+ {
+ switch (opt)
+ {
+ case 'n':
+ n = ACE_OS::atoi (get_opt.opt_arg ());
+ break;
+ case 'l':
+ lo = ACE_OS::atoi (get_opt.opt_arg ());
+ break;
+ case 'h':
+ hi = ACE_OS::atoi (get_opt.opt_arg ());
+ break;
+ case 's':
+ s = ACE_OS::atoi (get_opt.opt_arg ());
+ break;
+ case 'q':
+ quiet = 1;
+ break;
+
+ case '?':
+ default:
+ ACE_DEBUG ((LM_DEBUG,
+ "Usage: %s "
+ "-l low "
+ "-h high "
+ "-s step "
+ "-n n "
+ "\n"
+ "Writes and then reads octet sequences to a CDR stream "
+ "starting from <low> up to <high> incrementing "
+ "by <step>, at each step run <n> iterations to "
+ "average."
+ "\n",
+ argv[0]));
+ return -1;
+ }
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Running:\n"
+ " low: %d\n"
+ " hi : %d\n"
+ " s : %d\n"
+ " n : %d\n",
+ lo, hi, s, n));
+
+ // Create a "big" buffer and fill it up.
+ char* buf = new char[hi];
+ CORBA::Long l = 0xdeadbeef;
+ for (int i = 0; i < hi / (int) sizeof (l); ++i)
+ {
+ ACE_OS::memcpy (buf + sizeof (l) * i, &l, sizeof (l));
+ }
+
+ if (run (buf, hi,
+ n, lo, s, quiet,
+ "OCTET", test_write_octet, test_read_octet) != 0)
+ return 1;
+
+ if (run (buf, hi,
+ n, lo, s, quiet,
+ "CHAR", test_write_char, test_read_char) != 0)
+ return 1;
+ delete[] buf;
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("OctetSeq");
+ }
+
+ return 0;
+}