+
+// Apple addition
+#include <unistd.h>
+#include <mach/mach_time.h>
+#include <unicode/ustring.h>
+#include <unicode/udat.h>
+enum { kUCharsOutMax = 128, kBytesOutMax = 256 };
+
+static void cmd_perf() {
+ static const char* locale = "en_US";
+ static const UChar* tzName = (const UChar*)u"America/Los_Angeles";
+ static const UDate udatTry1 = 1290714600000.0; // 2010 Nov. 25 (Thurs) 11:50:00 AM PT
+ static const UDate udatTry2 = 1451736016000.0; // 2016 Jan. 02 ...
+ int remaining = 2;
+ mach_timebase_info_data_t info;
+ mach_timebase_info(&info);
+ while (remaining-- > 0) {
+ uint64_t start, durationOpen, durationUse1, durationUse2;
+ UDateFormat *udatfmt;
+ int32_t datlen1, datlen2;
+ UChar outUChars[kUCharsOutMax];
+ UErrorCode status = U_ZERO_ERROR;
+
+ start = mach_absolute_time();
+ udatfmt = udat_open(UDAT_MEDIUM, UDAT_FULL, locale, tzName, -1, NULL, 0, &status);
+ durationOpen = ((mach_absolute_time() - start) * info.numer)/info.denom;
+ if ( U_SUCCESS(status) ) {
+ start = mach_absolute_time();
+ datlen1 = udat_format(udatfmt, udatTry1, outUChars, kUCharsOutMax, NULL, &status);
+ durationUse1 = ((mach_absolute_time() - start) * info.numer)/info.denom;
+
+ start = mach_absolute_time();
+ datlen2 = udat_format(udatfmt, udatTry2, outUChars, kUCharsOutMax, NULL, &status);
+ durationUse2 = ((mach_absolute_time() - start) * info.numer)/info.denom;
+
+ if ( U_SUCCESS(status) ) {
+ printf("first time %d udat open, fmt1(len %d), fmt2(len %d) nsec:\t%llu\t%llu\t%llu\n", remaining, datlen1, datlen2, durationOpen, durationUse1, durationUse2);
+ } else {
+ printf("first time %d udat_format failed\n", remaining);
+ }
+ udat_close(udatfmt);
+ } else {
+ printf("first time %d udat_open failed\n", remaining);
+ }
+ }
+}
+