فهرست منبع

Add a sample that compares Duff's device with normal loops.

mingodad 12 سال پیش
والد
کامیت
9582f667c8
1فایلهای تغییر یافته به همراه75 افزوده شده و 0 حذف شده
  1. 75 0
      SquiLu/samples/test-duffs-device.nut

+ 75 - 0
SquiLu/samples/test-duffs-device.nut

@@ -0,0 +1,75 @@
+local tbl = {len2 = function() {return "dad";}, }
+
+print(tbl.size(), tbl.len(), tbl.len2());
+
+local s = "dad";
+
+switch(s){
+	case "dad": print(1, s); break;
+	case "tais": print(2, s); break;
+	default:
+		print(3, s);
+}
+
+local function process(i){
+	return i+i;
+}
+
+local count = 10000;
+
+local values = array(1000);
+for(var i=0, len=values.len(); i < len; ++i) values[i] = i; 
+
+local start = os.clock();
+for(var k=0; k < count; ++k){
+	var iterations = math.floor(values.len() / 8);
+	var startAt = values.len() % 8;
+	var i = 0;
+
+	do {
+	    switch(startAt){
+		case 0: process(values[i++]);
+		case 7: process(values[i++]);
+		case 6: process(values[i++]);
+		case 5: process(values[i++]);
+		case 4: process(values[i++]);
+		case 3: process(values[i++]);
+		case 2: process(values[i++]);
+		case 1: process(values[i++]);
+	    }
+	    startAt = 0;
+	} while (--iterations > 0);
+}
+print("Duff's Device with switch took:", os.clock()-start);
+
+start = os.clock();
+for(var k=0; k < count; ++k){
+	var iterations = math.floor(values.len() / 8);
+	var leftover = values.len() % 8;
+	var i = 0;
+
+	if (leftover > 0){
+	    do {
+		process(values[i++]);
+	    } while (--leftover > 0);
+	}
+
+	do {
+	    process(values[i++]);
+	    process(values[i++]);
+	    process(values[i++]);
+	    process(values[i++]);
+	    process(values[i++]);
+	    process(values[i++]);
+	    process(values[i++]);
+	    process(values[i++]);
+	} while (--iterations > 0);
+}
+print("Duff's Device without switch took:", os.clock()-start);
+
+start = os.clock();
+for(var k=0; k < count; ++k){
+	for(var i=0, len=values.len(); i < len; ++i) process(values[i]);
+}
+print("for loop took:", os.clock()-start);
+