Ver código fonte

Merge pull request #4194 from thomasuster/development

hxSerialize performance improvement for references
Simon Krajewski 10 anos atrás
pai
commit
91cd7828ad
1 arquivos alterados com 13 adições e 5 exclusões
  1. 13 5
      std/haxe/Serializer.hx

+ 13 - 5
std/haxe/Serializer.hx

@@ -70,6 +70,7 @@ class Serializer {
 
 	var buf : StringBuf;
 	var cache : Array<Dynamic>;
+	var indices : haxe.ds.ObjectMap<Dynamic, Int>;
 	var shash : haxe.ds.StringMap<Int>;
 	var scount : Int;
 
@@ -100,6 +101,7 @@ class Serializer {
 	public function new() {
 		buf = new StringBuf();
 		cache = new Array();
+		indices = new haxe.ds.ObjectMap<Dynamic, Int>();
 		useCache = USE_CACHE;
 		useEnumIndex = USE_ENUM_INDEX;
 		shash = new haxe.ds.StringMap();
@@ -171,14 +173,9 @@ class Serializer {
 	function serializeRef(v) {
 		#if js
 		var vt = untyped __js__("typeof")(v);
-		#end
 		for( i in 0...cache.length ) {
-			#if js
 			var ci = cache[i];
 			if( untyped __js__("typeof")(ci) == vt && ci == v ) {
-			#else
-			if( cache[i] == v ) {
-			#end
 				buf.add("r");
 				buf.add(i);
 				return true;
@@ -186,6 +183,17 @@ class Serializer {
 		}
 		cache.push(v);
 		return false;
+		#else
+		var i:Null<Int> = indices.get(v);
+		if(i == null) {
+			indices.set(v, cache.length);
+			cache.push(v);
+			return false;
+		}
+		buf.add("r");
+		buf.add(i);
+		return true;
+		#end
 	}
 
 	#if flash