diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-10 16:22:08 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-10 16:22:08 +0000 |
commit | ab3be5a113dad5063e5a8f168857804d975444d1 (patch) | |
tree | 51ab600837dbd19932481b95e863d6d1e8518e80 /content/renderer/java | |
parent | a9471a7d255440039c8298fa502ba01eeddfbd1b (diff) | |
download | chromium_src-ab3be5a113dad5063e5a8f168857804d975444d1.zip chromium_src-ab3be5a113dad5063e5a8f168857804d975444d1.tar.gz chromium_src-ab3be5a113dad5063e5a8f168857804d975444d1.tar.bz2 |
[Android] Cache injected Java objects' methods info on renderer side
Every invocation of Java method via an interface JS wrapper injected by Java bridge
is preceded by a call to GetNamedProperty. As method presence can't change
during Java object's lifetime, we should cache it on the renderer side, as every
IPC call to the browser side is super-expensive.
This optimization improves Cordova's "exec" benchmark speed by astonishing 60%, as
we shave off half of the IPC calls.
BUG=355644
Review URL: https://codereview.chromium.org/381683002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282345 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/java')
-rw-r--r-- | content/renderer/java/gin_java_bridge_object.cc | 10 | ||||
-rw-r--r-- | content/renderer/java/gin_java_bridge_object.h | 3 |
2 files changed, 11 insertions, 2 deletions
diff --git a/content/renderer/java/gin_java_bridge_object.cc b/content/renderer/java/gin_java_bridge_object.cc index d2a2b60..b4cf3bf 100644 --- a/content/renderer/java/gin_java_bridge_object.cc +++ b/content/renderer/java/gin_java_bridge_object.cc @@ -83,7 +83,15 @@ gin::ObjectTemplateBuilder GinJavaBridgeObject::GetObjectTemplateBuilder( v8::Local<v8::Value> GinJavaBridgeObject::GetNamedProperty( v8::Isolate* isolate, const std::string& property) { - if (dispatcher_ && dispatcher_->HasJavaMethod(object_id_, property)) { + std::map<std::string, bool>::iterator method_pos = + known_methods_.find(property); + if (method_pos == known_methods_.end()) { + if (!dispatcher_) { + return v8::Local<v8::Value>(); + } + known_methods_[property] = dispatcher_->HasJavaMethod(object_id_, property); + } + if (known_methods_[property]) { return gin::CreateFunctionTemplate( isolate, base::Bind(&GinJavaBridgeObject::InvokeMethod, diff --git a/content/renderer/java/gin_java_bridge_object.h b/content/renderer/java/gin_java_bridge_object.h index 97b74c5..2f6c6e4 100644 --- a/content/renderer/java/gin_java_bridge_object.h +++ b/content/renderer/java/gin_java_bridge_object.h @@ -5,7 +5,7 @@ #ifndef CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_OBJECT_H_ #define CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_OBJECT_H_ -#include <set> +#include <map> #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" @@ -61,6 +61,7 @@ class GinJavaBridgeObject : public gin::Wrappable<GinJavaBridgeObject>, base::WeakPtr<GinJavaBridgeDispatcher> dispatcher_; GinJavaBridgeDispatcher::ObjectID object_id_; scoped_ptr<GinJavaBridgeValueConverter> converter_; + std::map<std::string, bool> known_methods_; DISALLOW_COPY_AND_ASSIGN(GinJavaBridgeObject); }; |