8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes

Thu, 23 May 2013 23:04:33 -0700

author
sspitsyn
date
Thu, 23 May 2013 23:04:33 -0700
changeset 5178
b7fa10a3a69a
parent 5177
699d9df07e59
child 5179
cd83e1d98347

8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
Summary: The fix of perf regression is to use method_idnum() for direct indexing into NMT
Reviewed-by: twisti, kvn, coleenp, dholmes
Contributed-by: serguei.spitsyn@oracle.com

src/share/vm/oops/instanceKlass.cpp file | annotate | diff | comparison | revisions
src/share/vm/oops/instanceKlass.hpp file | annotate | diff | comparison | revisions
src/share/vm/prims/methodHandles.cpp file | annotate | diff | comparison | revisions
src/share/vm/prims/methodHandles.hpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/oops/instanceKlass.cpp	Thu May 23 17:39:32 2013 +0200
     1.2 +++ b/src/share/vm/oops/instanceKlass.cpp	Thu May 23 23:04:33 2013 -0700
     1.3 @@ -2754,15 +2754,28 @@
     1.4    return NULL;
     1.5  }
     1.6  
     1.7 -void InstanceKlass::add_member_name(Handle mem_name) {
     1.8 +void InstanceKlass::add_member_name(int index, Handle mem_name) {
     1.9    jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
    1.10    MutexLocker ml(MemberNameTable_lock);
    1.11 +  assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
    1.12    DEBUG_ONLY(No_Safepoint_Verifier nsv);
    1.13  
    1.14    if (_member_names == NULL) {
    1.15 -    _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable();
    1.16 +    _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count());
    1.17    }
    1.18 -  _member_names->add_member_name(mem_name_wref);
    1.19 +  _member_names->add_member_name(index, mem_name_wref);
    1.20 +}
    1.21 +
    1.22 +oop InstanceKlass::get_member_name(int index) {
    1.23 +  MutexLocker ml(MemberNameTable_lock);
    1.24 +  assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
    1.25 +  DEBUG_ONLY(No_Safepoint_Verifier nsv);
    1.26 +
    1.27 +  if (_member_names == NULL) {
    1.28 +    return NULL;
    1.29 +  }
    1.30 +  oop mem_name =_member_names->get_member_name(index);
    1.31 +  return mem_name;
    1.32  }
    1.33  
    1.34  // -----------------------------------------------------------------------------------------------------
     2.1 --- a/src/share/vm/oops/instanceKlass.hpp	Thu May 23 17:39:32 2013 +0200
     2.2 +++ b/src/share/vm/oops/instanceKlass.hpp	Thu May 23 23:04:33 2013 -0700
     2.3 @@ -1022,7 +1022,8 @@
     2.4    // JSR-292 support
     2.5    MemberNameTable* member_names() { return _member_names; }
     2.6    void set_member_names(MemberNameTable* member_names) { _member_names = member_names; }
     2.7 -  void add_member_name(Handle member_name);
     2.8 +  void add_member_name(int index, Handle member_name);
     2.9 +  oop  get_member_name(int index);
    2.10  
    2.11  public:
    2.12    // JVMTI support
     3.1 --- a/src/share/vm/prims/methodHandles.cpp	Thu May 23 17:39:32 2013 +0200
     3.2 +++ b/src/share/vm/prims/methodHandles.cpp	Thu May 23 23:04:33 2013 -0700
     3.3 @@ -1,5 +1,5 @@
     3.4  /*
     3.5 - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
     3.6 + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
     3.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3.8   *
     3.9   * This code is free software; you can redistribute it and/or modify it
    3.10 @@ -232,7 +232,8 @@
    3.11    // This is done eagerly, since it is readily available without
    3.12    // constructing any new objects.
    3.13    // TO DO: maybe intern mname_oop
    3.14 -  m->method_holder()->add_member_name(mname);
    3.15 +  m->method_holder()->add_member_name(m->method_idnum(), mname);
    3.16 +
    3.17    return mname();
    3.18  }
    3.19  
    3.20 @@ -301,7 +302,6 @@
    3.21    // Although the fieldDescriptor::_index would also identify the field,
    3.22    // we do not use it, because it is harder to decode.
    3.23    // TO DO: maybe intern mname_oop
    3.24 -  InstanceKlass::cast(field_holder())->add_member_name(mname);
    3.25    return mname();
    3.26  }
    3.27  
    3.28 @@ -943,7 +943,8 @@
    3.29  // MemberNameTable
    3.30  //
    3.31  
    3.32 -MemberNameTable::MemberNameTable() : GrowableArray<jweak>(10, true) {
    3.33 +MemberNameTable::MemberNameTable(int methods_cnt)
    3.34 +                  : GrowableArray<jweak>(methods_cnt, true) {
    3.35    assert_locked_or_safepoint(MemberNameTable_lock);
    3.36  }
    3.37  
    3.38 @@ -957,29 +958,18 @@
    3.39    }
    3.40  }
    3.41  
    3.42 -// Return entry index if found, return -1 otherwise.
    3.43 -int MemberNameTable::find_member_name(oop mem_name) {
    3.44 +void MemberNameTable::add_member_name(int index, jweak mem_name_wref) {
    3.45    assert_locked_or_safepoint(MemberNameTable_lock);
    3.46 -  int len = this->length();
    3.47 -
    3.48 -  for (int idx = 0; idx < len; idx++) {
    3.49 -    jweak ref = this->at(idx);
    3.50 -    oop entry = JNIHandles::resolve(ref);
    3.51 -    if (entry == mem_name) {
    3.52 -      return idx;
    3.53 -    }
    3.54 -  }
    3.55 -  return -1;
    3.56 +  this->at_put_grow(index, mem_name_wref);
    3.57  }
    3.58  
    3.59 -void MemberNameTable::add_member_name(jweak mem_name_wref) {
    3.60 +// Return a member name oop or NULL.
    3.61 +oop MemberNameTable::get_member_name(int index) {
    3.62    assert_locked_or_safepoint(MemberNameTable_lock);
    3.63 -  oop mem_name = JNIHandles::resolve(mem_name_wref);
    3.64  
    3.65 -  // Each member name may appear just once: add only if not found
    3.66 -  if (find_member_name(mem_name) == -1) {
    3.67 -    this->append(mem_name_wref);
    3.68 -  }
    3.69 +  jweak ref = this->at(index);
    3.70 +  oop mem_name = JNIHandles::resolve(ref);
    3.71 +  return mem_name;
    3.72  }
    3.73  
    3.74  #if INCLUDE_JVMTI
     4.1 --- a/src/share/vm/prims/methodHandles.hpp	Thu May 23 17:39:32 2013 +0200
     4.2 +++ b/src/share/vm/prims/methodHandles.hpp	Thu May 23 23:04:33 2013 -0700
     4.3 @@ -1,5 +1,5 @@
     4.4  /*
     4.5 - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
     4.6 + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
     4.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4.8   *
     4.9   * This code is free software; you can redistribute it and/or modify it
    4.10 @@ -219,7 +219,6 @@
    4.11    }
    4.12  };
    4.13  
    4.14 -
    4.15  //------------------------------------------------------------------------------
    4.16  // MethodHandlesAdapterGenerator
    4.17  //
    4.18 @@ -233,13 +232,13 @@
    4.19  //------------------------------------------------------------------------------
    4.20  // MemberNameTable
    4.21  //
    4.22 +
    4.23  class MemberNameTable : public GrowableArray<jweak> {
    4.24   public:
    4.25 -  MemberNameTable();
    4.26 +  MemberNameTable(int methods_cnt);
    4.27    ~MemberNameTable();
    4.28 -  void add_member_name(jweak mem_name_ref);
    4.29 - private:
    4.30 -  int find_member_name(oop mem_name);
    4.31 +  void add_member_name(int index, jweak mem_name_ref);
    4.32 +  oop  get_member_name(int index);
    4.33  
    4.34  #if INCLUDE_JVMTI
    4.35   public:

mercurial