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