Kaynağa Gözat

Added explicit function "set" for array, surprisingly it has worst performance than "[]" operator, see test-string-concatenation.nut .

mingodad 12 yıl önce
ebeveyn
işleme
91497d5794

+ 87 - 11
SquiLu/samples/test-string-concatenation.nut

@@ -70,9 +70,10 @@ for(var k=0; k < count; ++k){
 }
 }
 print("String concatenation with array.concat1 took:", os.clock()-start);
 print("String concatenation with array.concat1 took:", os.clock()-start);
 
 
+var buffer = array(24);
+
 start = os.clock();
 start = os.clock();
 for(var k=0; k < count; ++k){
 for(var k=0; k < count; ++k){
-	var buffer = array(24);
 	buffer.clear();
 	buffer.clear();
 	buffer.push("Hello");
 	buffer.push("Hello");
 	buffer.push(" ");
 	buffer.push(" ");
@@ -104,13 +105,12 @@ for(var k=0; k < count; ++k){
 print("String concatenation with array.concat2 took:", os.clock()-start);
 print("String concatenation with array.concat2 took:", os.clock()-start);
 
 
 
 
-var buffer3 = array(24);
-print(type(buffer3))
-var push = buffer3.push.bindenv(buffer3);
+print(type(buffer))
+var push = buffer.push.bindenv(buffer);
 print(type(push), type(push.getenv()), type(push.getenv().ref()))
 print(type(push), type(push.getenv()), type(push.getenv().ref()))
 
 
 {
 {
-	buffer3.clear();
+	buffer.clear();
 	push("Hello");
 	push("Hello");
 	push(" ");
 	push(" ");
 	push("World!");
 	push("World!");
@@ -136,13 +136,13 @@ print(type(push), type(push.getenv()), type(push.getenv().ref()))
 	push(" ");
 	push(" ");
 	push("World!");
 	push("World!");
 
 
-	print(buffer3.concat());
+	print(buffer.concat());
 
 
 }
 }
 
 
 start = os.clock();
 start = os.clock();
 for(var k=0; k < count; ++k){
 for(var k=0; k < count; ++k){
-	buffer3.clear();
+	buffer.clear();
 	push("Hello");
 	push("Hello");
 	push(" ");
 	push(" ");
 	push("World!");
 	push("World!");
@@ -168,13 +168,17 @@ for(var k=0; k < count; ++k){
 	push(" ");
 	push(" ");
 	push("World!");
 	push("World!");
 
 
-	var text = buffer3.concat();
+	var text = buffer.concat();
 }
 }
 print("String concatenation with array.concat3 took:", os.clock()-start);
 print("String concatenation with array.concat3 took:", os.clock()-start);
 
 
+buffer.resize(24);
+
 start = os.clock();
 start = os.clock();
 for(var k=0; k < count; ++k){
 for(var k=0; k < count; ++k){
-	var buffer = array(24), i = 0;
+	var i = 0;
+	buffer.clear();
+	buffer.resize(24);
 	buffer[i++] = "Hello";
 	buffer[i++] = "Hello";
 	buffer[i++] = " ";
 	buffer[i++] = " ";
 	buffer[i++] = "World!";
 	buffer[i++] = "World!";
@@ -206,7 +210,9 @@ print("String concatenation with array2.concat took:", os.clock()-start);
 
 
 start = os.clock();
 start = os.clock();
 for(var k=0; k < count; ++k){
 for(var k=0; k < count; ++k){
-	var buffer = array(24), i = -1;
+	var i = -1;
+	buffer.clear();
+	buffer.resize(24);
 	buffer[++i] = "Hello";
 	buffer[++i] = "Hello";
 	buffer[++i] = " ";
 	buffer[++i] = " ";
 	buffer[++i] = "World!";
 	buffer[++i] = "World!";
@@ -234,4 +240,74 @@ for(var k=0; k < count; ++k){
 
 
 	var text = buffer.concat();
 	var text = buffer.concat();
 }
 }
-print("String concatenation with array2.concat took:", os.clock()-start);
+print("String concatenation with array3.concat took:", os.clock()-start);
+
+var ary_set = buffer.set.bindenv(buffer);
+
+start = os.clock();
+for(var k=0; k < count; ++k){
+	var i = -1;
+	buffer.clear();
+	buffer.resize(24);
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+	ary_set(++i, "Hello");
+	ary_set(++i,  " ");
+	ary_set(++i,  "World!");
+
+	var text = buffer.concat();
+}
+print("String concatenation with array4.concat took:", os.clock()-start);
+
+start = os.clock();
+for(var k=0; k < count; ++k){
+	var i = -1;
+	buffer.clear();
+	buffer.resize(24);
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+	buffer.set(++i, "Hello");
+	buffer.set(++i,  " ");
+	buffer.set(++i,  "World!");
+
+	var text = buffer.concat();
+}
+print("String concatenation with array5.concat took:", os.clock()-start);

+ 11 - 0
SquiLu/squirrel/sqbaselib.cpp

@@ -641,6 +641,16 @@ static SQRESULT array_insert(HSQUIRRELVM v)
 		return sq_throwerror(v,_SC("index out of range"));
 		return sq_throwerror(v,_SC("index out of range"));
 	return 0;
 	return 0;
 }
 }
+
+static SQRESULT array_set(HSQUIRRELVM v)
+{
+	SQObject &o=stack_get(v,1);
+	SQObject &idx=stack_get(v,2);
+	SQObject &val=stack_get(v,3);
+	if(!_array(o)->Set(tointeger(idx),val))
+		return sq_throwerror(v,_SC("index out of range"));
+	return 0;
+}
 
 
 static SQRESULT array_remove(HSQUIRRELVM v)
 static SQRESULT array_remove(HSQUIRRELVM v)
 {
 {
@@ -1037,6 +1047,7 @@ SQRegFunction SQSharedState::_array_default_delegate_funcz[]={
 	{_SC("concat2"),array_concat2,-1, _SC("as")},
 	{_SC("concat2"),array_concat2,-1, _SC("as")},
 	{_SC("getdelegate"),array_getdelegate,1, _SC(".")},
 	{_SC("getdelegate"),array_getdelegate,1, _SC(".")},
 	{_SC("get"),container_rawget, -2, _SC("ai.")},
 	{_SC("get"),container_rawget, -2, _SC("ai.")},
+	{_SC("set"),array_set, 3, _SC("ai.")},
 	{_SC("empty"),array_empty, 1, _SC("a")},
 	{_SC("empty"),array_empty, 1, _SC("a")},
 	{0,0}
 	{0,0}
 };
 };