struct GNUNET_DISK_FileHandle *fh;
pid_t pid = getpid ();
pid_t tid = syscall (SYS_gettid);
+ char *benchmark_dir;
char *s;
- GNUNET_asprintf (&s, "gnunet-benchmark-%llu-%llu.txt",
+ benchmark_dir = getenv ("GNUNET_BENCHMARK_DIR");
+
+ if (NULL == benchmark_dir)
+ return;
+
+ if (GNUNET_OK != GNUNET_DISK_directory_create (benchmark_dir))
+ {
+ GNUNET_break (0);
+ return;
+ }
+
+ GNUNET_asprintf (&s, "%s/gnunet-benchmark-ops-%s-%llu-%llu.txt",
+ benchmark_dir,
+ (pid == tid) ? "main" : "thread",
(unsigned long long) pid,
(unsigned long long) tid);
GNUNET_assert (NULL != fh);
GNUNET_free (s);
- GNUNET_asprintf (&s, "eddsa_sign_count %llu",
- (unsigned long long) bd->eddsa_sign_count);
- GNUNET_assert (GNUNET_SYSERR != GNUNET_DISK_file_write_blocking (fh, s, strlen (s)));
- GNUNET_free (s);
+#define WRITE_BENCHMARK_OP(opname) do { \
+ GNUNET_asprintf (&s, "op " #opname " count %llu time_us %llu\n", \
+ (unsigned long long) bd->opname##_count, \
+ (unsigned long long) bd->opname##_time.rel_value_us); \
+ GNUNET_assert (GNUNET_SYSERR != GNUNET_DISK_file_write_blocking (fh, s, strlen (s))); \
+ GNUNET_free (s); \
+} while (0)
+
+ WRITE_BENCHMARK_OP (ecc_ecdh);
+ WRITE_BENCHMARK_OP (ecdh_eddsa);
+ WRITE_BENCHMARK_OP (ecdhe_key_create);
+ WRITE_BENCHMARK_OP (ecdhe_key_get_public);
+ WRITE_BENCHMARK_OP (ecdsa_ecdh);
+ WRITE_BENCHMARK_OP (ecdsa_key_create);
+ WRITE_BENCHMARK_OP (ecdsa_key_get_public);
+ WRITE_BENCHMARK_OP (ecdsa_sign);
+ WRITE_BENCHMARK_OP (ecdsa_verify);
+ WRITE_BENCHMARK_OP (eddsa_ecdh);
+ WRITE_BENCHMARK_OP (eddsa_key_create);
+ WRITE_BENCHMARK_OP (eddsa_key_get_public);
+ WRITE_BENCHMARK_OP (eddsa_sign);
+ WRITE_BENCHMARK_OP (eddsa_verify);
+ WRITE_BENCHMARK_OP (hash);
+ WRITE_BENCHMARK_OP (hash_context_finish);
+ WRITE_BENCHMARK_OP (hash_context_read);
+ WRITE_BENCHMARK_OP (hash_context_start);
+ WRITE_BENCHMARK_OP (hkdf);
+ WRITE_BENCHMARK_OP (rsa_blind);
+ WRITE_BENCHMARK_OP (rsa_private_key_create);
+ WRITE_BENCHMARK_OP (rsa_private_key_get_public);
+ WRITE_BENCHMARK_OP (rsa_sign_blinded);
+ WRITE_BENCHMARK_OP (rsa_unblind);
+ WRITE_BENCHMARK_OP (rsa_verify);
+
+#undef WRITE_BENCHMARK_OP
GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh));
- GNUNET_asprintf (&s, "gnunet-benchmark-urls-%llu-%llu.txt",
+ GNUNET_asprintf (&s, "%s/gnunet-benchmark-urls-%s-%llu-%llu.txt",
+ benchmark_dir,
+ (pid == tid) ? "main" : "thread",
(unsigned long long) pid,
(unsigned long long) tid);
for (unsigned int i = 0; i < bd->urd_len; i++)
{
struct UrlRequestData *urd = &bd->urd[i];
- GNUNET_asprintf (&s, "url %s count %lld time_us %lld\n",
+ GNUNET_asprintf (&s, "url %s status %u count %llu time_us %llu time_us_max %llu\n",
urd->request_url,
+ urd->status,
(unsigned long long) urd->count,
- (unsigned long long) urd->time.rel_value_us);
+ (unsigned long long) urd->time.rel_value_us,
+ (unsigned long long) urd->time_max.rel_value_us);
GNUNET_assert (GNUNET_SYSERR != GNUNET_DISK_file_write_blocking (fh, s, strlen (s)));
GNUNET_free (s);
}
return;
GNUNET_assert (NULL != bd);
+ write_benchmark_data (bd);
}
* Initialize the thread-local variable key for benchmark data.
*/
static void
-make_key()
+make_key ()
{
(void) pthread_key_create (&key, &thread_destructor);
}
* Get benchmark data for a URL. If the URL is too long, it's truncated
* before looking up the correspoding benchmark data.
*
+ * Statistics are bucketed by URL and status code.
+ *
* @param url url to get request data for
+ * @param status http status code
*/
struct UrlRequestData *
-get_url_benchmark_data (char *url)
+get_url_benchmark_data (char *url, unsigned int status)
{
char trunc[MAX_BENCHMARK_URL_LEN];
struct BenchmarkData *bd;
memcpy (trunc, url, MAX_BENCHMARK_URL_LEN);
trunc[MAX_BENCHMARK_URL_LEN - 1] = 0;
+ /* We're not interested in what's after the query string */
+ for (size_t i = 0; i < strlen (trunc); i++)
+ {
+ if (trunc[i] == '?')
+ {
+ trunc[i] = 0;
+ break;
+ }
+ }
+
bd = get_benchmark_data ();
GNUNET_assert (bd->urd_len <= bd->urd_capacity);
for (unsigned int i = 0; i < bd->urd_len; i++)
{
- if (0 == strcmp (trunc, bd->urd[i].request_url))
+ if ( (0 == strcmp (trunc, bd->urd[i].request_url)) &&
+ (bd->urd[i].status == status) )
return &bd->urd[i];
}
struct UrlRequestData urd = { 0 };
memcpy (&urd.request_url, trunc, MAX_BENCHMARK_URL_LEN);
+ urd.status = status;
if (bd->urd_len == bd->urd_capacity)
{