16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org **********************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 2011-2012,International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org **********************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utimer.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <math.h>
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "sieve.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* prime number sieve */
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI double uprv_calcSieveTime() {
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 1
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define SIEVE_SIZE U_LOTS_OF_TIMES /* standardized size */
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define SIEVE_SIZE  <something_smaller>
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define SIEVE_PRINT 0
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char sieve[SIEVE_SIZE];
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UTimer a,b;
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int i,k;
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  utimer_getTime(&a);
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(int j=0;j<SIEVE_SIZE;j++) {
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sieve[j]=1;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  sieve[0]=0;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  utimer_getTime(&b);
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SIEVE_PRINT
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("init %d: %.9f\n", SIEVE_SIZE,utimer_getDeltaSeconds(&a,&b));
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  utimer_getTime(&a);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=2;i<SIEVE_SIZE/2;i++) {
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(k=i*2;k<SIEVE_SIZE;k+=i) {
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      sieve[k]=0;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  utimer_getTime(&b);
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SIEVE_PRINT
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("sieve %d: %.9f\n", SIEVE_SIZE,utimer_getDeltaSeconds(&a,&b));
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(SIEVE_PRINT>0) {
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    k=0;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=2;i<SIEVE_SIZE && k<SIEVE_PRINT;i++) {
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(sieve[i]) {
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("%d ", i);
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        k++;
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    puts("");
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  {
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    k=0;
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<SIEVE_SIZE;i++) {
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(sieve[i]) k++;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("Primes: %d\n", k);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return utimer_getDeltaSeconds(&a,&b);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int comdoub(const void *aa, const void *bb)
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const double *a = (const double*)aa;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const double *b = (const double*)bb;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return (*a==*b)?0:((*a<*b)?-1:1);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdouble midpoint(double *times, double i, int n) {
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double fl = floor(i);
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double ce = ceil(i);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(ce>=n) ce=n;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(fl==ce) {
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return times[(int)fl];
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (times[(int)fl]+times[(int)ce])/2;
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdouble medianof(double *times, int n, int type) {
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  switch(type) {
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  case 1:
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return midpoint(times,n/4,n);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  case 2:
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return midpoint(times,n/2,n);
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  case 3:
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return midpoint(times,(n/2)+(n/4),n);
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return -1;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdouble qs(double *times, int n, double *q1, double *q2, double *q3) {
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *q1 = medianof(times,n,1);
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *q2 = medianof(times,n,2);
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *q3 = medianof(times,n,3);
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return *q3-*q1;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI double uprv_getMeanTime(double *times, uint32_t *timeCount, double *marginOfError) {
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double q1,q2,q3;
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int n = *timeCount;
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* calculate medians */
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  qsort(times,n,sizeof(times[0]),comdoub);
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double iqr = qs(times,n,&q1,&q2,&q3);
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double rangeMin=  (q1-(1.5*iqr));
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double rangeMax =  (q3+(1.5*iqr));
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Throw out outliers */
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int newN = n;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("iqr: %.9f, q1=%.9f, q2=%.9f, q3=%.9f, max=%.9f, n=%d\n", iqr,q1,q2,q3,(double)-1, n);
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(int i=0;i<newN;i++) {
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(times[i]<rangeMin || times[i]>rangeMax) {
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      printf("Removing outlier: %.9f outside [%.9f:%.9f]\n", times[i], rangeMin, rangeMax);
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      times[i--] = times[--newN]; // bring down a new value
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool didRemove = false;
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* if we removed any outliers, recalculate iqr */
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(newN<n) {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    didRemove = true;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("removed %d outlier(s), recalculating IQR..\n", n-newN);
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    n = newN;
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *timeCount = n;
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    qsort(times,n,sizeof(times[0]),comdoub);
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double iqr = qs(times,n,&q1,&q2,&q3);
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rangeMin=  (q1-(1.5*iqr));
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rangeMax =  (q3+(1.5*iqr));
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* calculate min/max and mean */
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double minTime = times[0];
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double maxTime = times[0];
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double meanTime = times[0];
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(int i=1;i<n;i++) {
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(minTime>times[i]) minTime=times[i];
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(maxTime<times[i]) maxTime=times[i];
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    meanTime+=times[i];
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  meanTime /= n;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* caculate standard deviation */
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double sd = 0;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(int i=0;i<n;i++) {
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(didRemove) {
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      printf("recalc %d/%d: %.9f\n", i, n, times[i]);
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sd += (times[i]-meanTime)*(times[i]-meanTime);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  sd = sqrt(sd/((double)n-1.0));
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("sd: %.9f, mean: %.9f\n", sd, meanTime);
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("min: %.9f, q1=%.9f, q2=%.9f, q3=%.9f, max=%.9f, n=%d\n", minTime,q1,q2,q3,maxTime, n);
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("iqr/sd = %.9f\n", iqr/sd);
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* 1.960 = z sub 0.025 */
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *marginOfError = 1.960 * (sd/sqrt((double)n));
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*printf("Margin of Error = %.4f (95%% confidence)\n", me);*/
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return meanTime;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool calcSieveTime = FALSE;
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdouble meanSieveTime = 0.0;
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdouble meanSieveME = 0.0;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI double uprv_getSieveTime(double *marginOfError) {
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(calcSieveTime==FALSE) {
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define SAMPLES 50
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t samples = SAMPLES;
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double times[SAMPLES];
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(int i=0;i<SAMPLES;i++) {
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      times[i] = uprv_calcSieveTime();
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_DEBUG
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      printf("sieve: %d/%d: %.9f\n", i,SAMPLES, times[i]);
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    meanSieveTime = uprv_getMeanTime(times, &samples,&meanSieveME);
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calcSieveTime=TRUE;
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(marginOfError!=NULL) {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *marginOfError = meanSieveME;
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return meanSieveTime;
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
214