From: Bernhard Urban Date: Tue, 17 May 2016 17:43:25 +0000 (-0700) Subject: [aot] use hashtable for caching typespec of classes X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=34687fb5a6c772becec2764299b6049b986cd3f9;p=mono.git [aot] use hashtable for caching typespec of classes I had a look in vtunes for ``` $ mono/mini/mono-sgen --stats -O=all --aot=threads=1,asmonly ~/work/benchmarker/tests/fsharp/lib/bootstrap/4.0/FSharp.Compiler.dll ``` and that method showed up as hot. With this change I get an improvement from ~27.4s down to ~24.3s on my machine. --- diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 9c2ca7090e6..4ae5c894de5 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -245,7 +245,7 @@ typedef struct MonoAotCompile { MonoAotFileFlags flags; MonoDynamicStream blob; gboolean blob_closed; - MonoClass **typespec_classes; + GHashTable *typespec_classes; GString *llc_args; GString *as_args; char *assembly_name_sym; @@ -2719,22 +2719,16 @@ find_typespec_for_class (MonoAotCompile *acfg, MonoClass *klass) /* FIXME: Search referenced images as well */ if (!acfg->typespec_classes) { - acfg->typespec_classes = (MonoClass **)mono_mempool_alloc0 (acfg->mempool, sizeof (MonoClass*) * len); - for (i = 0; i < len; ++i) { + acfg->typespec_classes = g_hash_table_new (NULL, NULL); + for (i = 0; i < len; i++) { MonoError error; - acfg->typespec_classes [i] = mono_class_get_and_inflate_typespec_checked (acfg->image, MONO_TOKEN_TYPE_SPEC | (i + 1), NULL, &error); + int typespec = MONO_TOKEN_TYPE_SPEC | (i + 1); + MonoClass *klass_key = mono_class_get_and_inflate_typespec_checked (acfg->image, typespec, NULL, &error); g_assert (mono_error_ok (&error)); /* FIXME error handling */ + g_hash_table_insert (acfg->typespec_classes, klass_key, GINT_TO_POINTER (typespec)); } } - for (i = 0; i < len; ++i) { - if (acfg->typespec_classes [i] == klass) - break; - } - - if (i < len) - return MONO_TOKEN_TYPE_SPEC | (i + 1); - else - return 0; + return GPOINTER_TO_INT (g_hash_table_lookup (acfg->typespec_classes, klass)); } static void @@ -10071,6 +10065,8 @@ acfg_free (MonoAotCompile *acfg) g_hash_table_destroy (acfg->image_hash); g_hash_table_destroy (acfg->unwind_info_offsets); g_hash_table_destroy (acfg->method_label_hash); + if (!acfg->typespec_classes) + g_hash_table_destroy (acfg->typespec_classes); g_hash_table_destroy (acfg->export_names); g_hash_table_destroy (acfg->plt_entry_debug_sym_cache); g_hash_table_destroy (acfg->klass_blob_hash);