Blame bin/fribidi-benchmark.c

Packit Service 12e4cd
/* FriBidi
Packit Service 12e4cd
 * fribidi-benchmark.c - command line benchmark tool for libfribidi
Packit Service 12e4cd
 *
Packit Service 12e4cd
 * Authors:
Packit Service 12e4cd
 *   Behdad Esfahbod, 2001, 2002, 2004
Packit Service 12e4cd
 *   Dov Grobgeld, 1999, 2000
Packit Service 12e4cd
 *
Packit Service 12e4cd
 * Copyright (C) 2004 Sharif FarsiWeb, Inc
Packit Service 12e4cd
 * Copyright (C) 2001,2002 Behdad Esfahbod
Packit Service 12e4cd
 * Copyright (C) 1999,2000 Dov Grobgeld
Packit Service 12e4cd
 * 
Packit Service 12e4cd
 * This library is free software; you can redistribute it and/or
Packit Service 12e4cd
 * modify it under the terms of the GNU Lesser General Public
Packit Service 12e4cd
 * License as published by the Free Software Foundation; either
Packit Service 12e4cd
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 12e4cd
 * 
Packit Service 12e4cd
 * This library is distributed in the hope that it will be useful,
Packit Service 12e4cd
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 12e4cd
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 12e4cd
 * Lesser General Public License for more details.
Packit Service 12e4cd
 * 
Packit Service 12e4cd
 * You should have received a copy of the GNU Lesser General Public License
Packit Service 12e4cd
 * along with this library, in a file named COPYING; if not, write to the
Packit Service 12e4cd
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit Service 12e4cd
 * Boston, MA 02110-1301, USA
Packit Service 12e4cd
 * 
Packit Service 12e4cd
 * For licensing issues, contact <fribidi.license@gmail.com>.
Packit Service 12e4cd
 */
Packit Service 12e4cd
Packit Service 12e4cd
#include <common.h>
Packit Service 12e4cd
Packit Service 12e4cd
#include <fribidi.h>
Packit Service 12e4cd
#include <fribidi-deprecated.h>
Packit Service 12e4cd
Packit Service 12e4cd
#include <stdio.h>
Packit Service 12e4cd
#ifdef STDC_HEADERS
Packit Service 12e4cd
# include <stdlib.h>
Packit Service 12e4cd
# include <stddef.h>
Packit Service 12e4cd
#else
Packit Service 12e4cd
# if HAVE_STDLIB_H
Packit Service 12e4cd
#  include <stdlib.h>
Packit Service 12e4cd
# endif
Packit Service 12e4cd
#endif
Packit Service 12e4cd
#ifdef HAVE_STRING_H
Packit Service 12e4cd
# if !STDC_HEADERS && HAVE_MEMORY_H
Packit Service 12e4cd
#  include <memory.h>
Packit Service 12e4cd
# endif
Packit Service 12e4cd
# include <string.h>
Packit Service 12e4cd
#endif
Packit Service 12e4cd
#ifdef HAVE_STRINGS_H
Packit Service 12e4cd
# include <strings.h>
Packit Service 12e4cd
#endif
Packit Service 12e4cd
#ifdef HAVE_SYS_TIMES_H
Packit Service 12e4cd
# include <sys/times.h>
Packit Service 12e4cd
#endif
Packit Service 12e4cd
#ifdef _WIN32
Packit Service 12e4cd
#include <windows.h>
Packit Service 12e4cd
#endif /* _WIN32 */
Packit Service 12e4cd
Packit Service 12e4cd
#include "getopt.h"
Packit Service 12e4cd
Packit Service 12e4cd
#define appname "fribidi_benchmark"
Packit Service 12e4cd
Packit Service 12e4cd
#define MAX_STR_LEN 1000
Packit Service 12e4cd
#define NUM_ITER 2000
Packit Service 12e4cd
Packit Service 12e4cd
static void
Packit Service 12e4cd
die2 (
Packit Service 12e4cd
  const char *fmt,
Packit Service 12e4cd
  const char *arg
Packit Service 12e4cd
)
Packit Service 12e4cd
{
Packit Service 12e4cd
  fprintf (stderr, "%s: ", appname);
Packit Service 12e4cd
  if (fmt)
Packit Service 12e4cd
    fprintf (stderr, fmt, arg);
Packit Service 12e4cd
  fprintf (stderr, "Try `%s --help' for more information.\n", appname);
Packit Service 12e4cd
  exit (-1);
Packit Service 12e4cd
}
Packit Service 12e4cd
Packit Service 12e4cd
#define TEST_STRING \
Packit Service 12e4cd
  "a THE QUICK -123,456 (FOX JUMPS ) DOG the quick !1@7#4&5^ over the dog " \
Packit Service 12e4cd
  "123,456 OVER THE 5%+ 4.0 LAZY"
Packit Service 12e4cd
#define TEST_STRING_EXPLICIT \
Packit Service 12e4cd
  "this is _LJUST_o a _lsimple _Rte%ST_o th_oat  HAS A _LPDF missing" \
Packit Service 12e4cd
  "AnD hOw_L AbOuT, 123,987 tHiS_o a GO_oOD - _L_oTE_oST. " \
Packit Service 12e4cd
  "here_L is_o_o_o _R a good one_o And _r 123,987_LT_oHE_R next_o oNE:" \
Packit Service 12e4cd
  "_R_r and the last _LONE_o IS THE _rbest _lONE and" \
Packit Service 12e4cd
  "a _L_L_L_LL_L_L_L_L_L_L_L_L_Rbug_o_o_o_o_o_o" \
Packit Service 12e4cd
  "_R_r and the last _LONE_o IS THE _rbest _lONE and" \
Packit Service 12e4cd
  "A REAL BIG_l_o BUG! _L _l_r_R_L_laslaj siw_o_Rlkj sslk" \
Packit Service 12e4cd
  "a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug" \
Packit Service 12e4cd
  "here_L is_o_o_o _R ab  one_o _r 123,987_LT_oHE_R t_o oNE:" \
Packit Service 12e4cd
Packit Service 12e4cd
static void
Packit Service 12e4cd
help (
Packit Service 12e4cd
  void
Packit Service 12e4cd
)
Packit Service 12e4cd
{
Packit Service 12e4cd
  printf
Packit Service 12e4cd
    ("Usage: " appname " [OPTION]...\n"
Packit Service 12e4cd
     "A program for benchmarking the speed of the " FRIBIDI_NAME
Packit Service 12e4cd
     " library.\n" "\n"
Packit Service 12e4cd
     "  -h, --help            Display this information and exit\n"
Packit Service 12e4cd
     "  -V, --version         Display version information and exit\n"
Packit Service 12e4cd
     "  -n, --niter N         Number of iterations. Default is %d.\n"
Packit Service 12e4cd
     "\nReport bugs online at\n<" FRIBIDI_BUGREPORT ">.\n", NUM_ITER);
Packit Service 12e4cd
  exit (0);
Packit Service 12e4cd
}
Packit Service 12e4cd
Packit Service 12e4cd
static void
Packit Service 12e4cd
version (
Packit Service 12e4cd
  void
Packit Service 12e4cd
)
Packit Service 12e4cd
{
Packit Service 12e4cd
  printf (appname " %s", fribidi_version_info);
Packit Service 12e4cd
  exit (0);
Packit Service 12e4cd
}
Packit Service 12e4cd
Packit Service 12e4cd
static double
Packit Service 12e4cd
utime (
Packit Service 12e4cd
  void
Packit Service 12e4cd
)
Packit Service 12e4cd
{
Packit Service 12e4cd
#ifdef _WIN32
Packit Service 12e4cd
  FILETIME creationTime, exitTime, kernelTime, userTime;
Packit Service 12e4cd
  HANDLE currentProcess = GetCurrentProcess();
Packit Service 12e4cd
  if (GetProcessTimes(currentProcess, &creationTime, &exitTime, &kernelTime, &userTime))
Packit Service 12e4cd
  {
Packit Service 12e4cd
      unsigned __int64 myTime = userTime.dwHighDateTime;
Packit Service 12e4cd
      myTime = (myTime << 32) | userTime.dwLowDateTime;
Packit Service 12e4cd
      return 1e-7 * myTime;
Packit Service 12e4cd
  }
Packit Service 12e4cd
  else
Packit Service 12e4cd
      return 0.0;
Packit Service 12e4cd
#else /* !_WIN32 */
Packit Service 12e4cd
#ifdef HAVE_SYS_TIMES_H
Packit Service 12e4cd
  struct tms tb;
Packit Service 12e4cd
  times (&tb);
Packit Service 12e4cd
  return 0.01 * tb.tms_utime;
Packit Service 12e4cd
#else
Packit Service 12e4cd
#warning Please fill in here to use other functions for determining time.
Packit Service 12e4cd
  return 0.0;
Packit Service 12e4cd
#endif
Packit Service 12e4cd
#endif
Packit Service 12e4cd
}
Packit Service 12e4cd
Packit Service 12e4cd
static void
Packit Service 12e4cd
benchmark (
Packit Service 12e4cd
  const char *S_,
Packit Service 12e4cd
  int niter
Packit Service 12e4cd
)
Packit Service 12e4cd
{
Packit Service 12e4cd
  int len, i;
Packit Service 12e4cd
  FriBidiChar us[MAX_STR_LEN], out_us[MAX_STR_LEN];
Packit Service 12e4cd
  FriBidiStrIndex positionLtoV[MAX_STR_LEN], positionVtoL[MAX_STR_LEN];
Packit Service 12e4cd
  FriBidiLevel embedding_list[MAX_STR_LEN];
Packit Service 12e4cd
  FriBidiParType base;
Packit Service 12e4cd
  double time0, time1;
Packit Service 12e4cd
Packit Service 12e4cd
  {
Packit Service 12e4cd
    int j;
Packit Service 12e4cd
    len = strlen (S_);
Packit Service 12e4cd
    for (i = 0, j = 0; i < len; i++)
Packit Service 12e4cd
      {
Packit Service 12e4cd
	if (S_[i] == '_')
Packit Service 12e4cd
	  switch (S_[++i])
Packit Service 12e4cd
	    {
Packit Service 12e4cd
	    case '>':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_LRM;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case '<':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_RLM;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case 'l':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_LRE;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case 'r':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_RLE;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case 'L':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_LRO;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case 'R':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_RLO;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case 'o':
Packit Service 12e4cd
	      us[j++] = FRIBIDI_CHAR_PDF;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    case '_':
Packit Service 12e4cd
	      us[j++] = '_';
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    default:
Packit Service 12e4cd
	      us[j++] = '_';
Packit Service 12e4cd
	      i--;
Packit Service 12e4cd
	      break;
Packit Service 12e4cd
	    }
Packit Service 12e4cd
	else
Packit Service 12e4cd
	  us[j++] = S_[i];
Packit Service 12e4cd
	if (us[j] >= 'A' && us[j] <= 'F')
Packit Service 12e4cd
	  us[j] += FRIBIDI_CHAR_ARABIC_ALEF - 'A';
Packit Service 12e4cd
	else if (us[j] >= 'G' && us[j] <= 'Z')
Packit Service 12e4cd
	  us[j] += FRIBIDI_CHAR_HEBREW_ALEF - 'G';
Packit Service 12e4cd
	else if (us[j] >= '6' && us[j] <= '9')
Packit Service 12e4cd
	  us[j] += FRIBIDI_CHAR_ARABIC_ZERO - '0';
Packit Service 12e4cd
      }
Packit Service 12e4cd
    len = j;
Packit Service 12e4cd
  }
Packit Service 12e4cd
Packit Service 12e4cd
  /* Start timer */
Packit Service 12e4cd
  time0 = utime ();
Packit Service 12e4cd
Packit Service 12e4cd
  for (i = 0; i < niter; i++)
Packit Service 12e4cd
    {
Packit Service 12e4cd
      /* Create a bidi string */
Packit Service 12e4cd
      base = FRIBIDI_PAR_ON;
Packit Service 12e4cd
FRIBIDI_BEGIN_IGNORE_DEPRECATIONS
Packit Service 12e4cd
      if (!fribidi_log2vis (us, len, &base,
Packit Service 12e4cd
			    /* output */
Packit Service 12e4cd
			    out_us, positionVtoL, positionLtoV,
Packit Service 12e4cd
			    embedding_list))
Packit Service 12e4cd
	die2
Packit Service 12e4cd
	  ("something failed in fribidi_log2vis.\n"
Packit Service 12e4cd
	   "perhaps memory allocation failure.", NULL);
Packit Service 12e4cd
FRIBIDI_END_IGNORE_DEPRECATIONS
Packit Service 12e4cd
    }
Packit Service 12e4cd
Packit Service 12e4cd
  /* stop timer */
Packit Service 12e4cd
  time1 = utime ();
Packit Service 12e4cd
Packit Service 12e4cd
  /* output result */
Packit Service 12e4cd
  printf ("Length = %d\n", len);
Packit Service 12e4cd
  printf ("Iterations = %d\n", niter);
Packit Service 12e4cd
  printf ("%d len*iterations in %f seconds\n", len * niter, time1 - time0);
Packit Service 12e4cd
  printf ("= %.0f kilo.length.iterations/second\n",
Packit Service 12e4cd
	  1.0 * len * niter / 1000 / (time1 - time0));
Packit Service 12e4cd
Packit Service 12e4cd
  return;
Packit Service 12e4cd
}
Packit Service 12e4cd
Packit Service 12e4cd
int
Packit Service 12e4cd
main (
Packit Service 12e4cd
  int argc,
Packit Service 12e4cd
  char *argv[]
Packit Service 12e4cd
)
Packit Service 12e4cd
{
Packit Service 12e4cd
  int niter = NUM_ITER;
Packit Service 12e4cd
Packit Service 12e4cd
  /* Parse the command line */
Packit Service 12e4cd
  argv[0] = appname;
Packit Service 12e4cd
  while (1)
Packit Service 12e4cd
    {
Packit Service 12e4cd
      int option_index = 0, c;
Packit Service 12e4cd
      static struct option long_options[] = {
Packit Service 12e4cd
	{"help", 0, 0, 'h'},
Packit Service 12e4cd
	{"version", 0, 0, 'V'},
Packit Service 12e4cd
	{"niter", 0, 0, 'n'},
Packit Service 12e4cd
	{0, 0, 0, 0}
Packit Service 12e4cd
      };
Packit Service 12e4cd
Packit Service 12e4cd
      c = getopt_long (argc, argv, "hVn:", long_options, &option_index);
Packit Service 12e4cd
      if (c == -1)
Packit Service 12e4cd
	break;
Packit Service 12e4cd
Packit Service 12e4cd
      switch (c)
Packit Service 12e4cd
	{
Packit Service 12e4cd
	case 0:
Packit Service 12e4cd
	  break;
Packit Service 12e4cd
	case 'h':
Packit Service 12e4cd
	  help ();
Packit Service 12e4cd
	  break;
Packit Service 12e4cd
	case 'V':
Packit Service 12e4cd
	  version ();
Packit Service 12e4cd
	  break;
Packit Service 12e4cd
	case 'n':
Packit Service 12e4cd
	  niter = atoi (optarg);
Packit Service 12e4cd
	  if (niter <= 0)
Packit Service 12e4cd
	    die2 ("invalid number of iterations `%s'\n", optarg);
Packit Service 12e4cd
	  break;
Packit Service 12e4cd
	case ':':
Packit Service 12e4cd
	case '?':
Packit Service 12e4cd
	  die2 (NULL, NULL);
Packit Service 12e4cd
	  break;
Packit Service 12e4cd
	default:
Packit Service 12e4cd
	  break;
Packit Service 12e4cd
	}
Packit Service 12e4cd
    }
Packit Service 12e4cd
Packit Service 12e4cd
  printf ("* Without explicit marks:\n");
Packit Service 12e4cd
  benchmark (TEST_STRING, niter);
Packit Service 12e4cd
  printf ("\n");
Packit Service 12e4cd
  printf ("* With explicit marks:\n");
Packit Service 12e4cd
  benchmark (TEST_STRING_EXPLICIT, niter);
Packit Service 12e4cd
Packit Service 12e4cd
  return 0;
Packit Service 12e4cd
}
Packit Service 12e4cd
Packit Service 12e4cd
/* Editor directions:
Packit Service 12e4cd
 * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
Packit Service 12e4cd
 */