blueloveTH 3 vuotta sitten
vanhempi
commit
8433d40f2c
9 muutettua tiedostoa jossa 29 lisäystä ja 18 poistoa
  1. 1 0
      .gitignore
  2. 0 6
      benchmarks/loop.py
  3. 2 0
      benchmarks/loop_0.py
  4. 2 0
      benchmarks/loop_1.py
  5. 6 0
      benchmarks/loop_2.py
  6. 2 2
      profile.sh
  7. 10 9
      src/ceval.h
  8. 5 0
      src/frame.h
  9. 1 1
      src/obj.h

+ 1 - 0
.gitignore

@@ -18,3 +18,4 @@ plugins/flutter/example/web/lib/pocketpy.wasm
 plugins/flutter/src/pocketpy.h
 plugins/macos/pocketpy/pocketpy.h
 plugins/godot/godot-cpp/
+123.txt

+ 0 - 6
benchmarks/loop.py

@@ -1,6 +0,0 @@
-x = 0
-
-for i in range(5000000):
-    x += 1
-
-assert x == 5000000

+ 2 - 0
benchmarks/loop_0.py

@@ -0,0 +1,2 @@
+for i in range(10000000):
+    pass

+ 2 - 0
benchmarks/loop_1.py

@@ -0,0 +1,2 @@
+for i in range(10000000):
+    x = i

+ 6 - 0
benchmarks/loop_2.py

@@ -0,0 +1,6 @@
+x = 0
+
+for i in range(10000000):
+    x += 1
+
+assert x == 10000000

+ 2 - 2
profile.sh

@@ -1,6 +1,6 @@
-g++ -o pocketpy src/main.cpp --std=c++17 -pg -O1 -fno-rtti
+g++ -o pocketpy src/main.cpp --std=c++17 -pg -O2 -fno-rtti
 
-./pocketpy benchmarks/simple.py
+./pocketpy benchmarks/loop_1.py
 
 gprof pocketpy gmon.out > gprof.txt
 

+ 10 - 9
src/ceval.h

@@ -55,9 +55,11 @@ PyVar VM::run_frame(Frame* frame){
             else frame->push(PyRef(ref));
         } continue;
         case OP_STORE_REF: {
-            PyVar obj = frame->pop_value(this);
-            PyVarRef r = frame->pop();
-            PyRef_AS_C(r)->set(this, frame, std::move(obj));
+            // PyVar obj = frame->pop_value(this);
+            // PyVarRef r = frame->pop();
+            // PyRef_AS_C(r)->set(this, frame, std::move(obj));
+            PyRef_AS_C(frame->top_1())->set(this, frame, frame->top_value(this));
+            frame->_pop(); frame->_pop();
         } continue;
         case OP_DELETE_REF: 
             PyRef_AS_C(frame->top())->del(this, frame);
@@ -228,17 +230,16 @@ PyVar VM::run_frame(Frame* frame){
         } continue;
         case OP_GET_ITER: {
             PyVar obj = frame->pop_value(this);
-            PyVar iter_obj = asIter(obj);
-            PyVarRef var = frame->pop();
-            check_type(var, tp_ref);
-            PyIter_AS_C(iter_obj)->var = var;
-            frame->push(std::move(iter_obj));
+            PyVar iter = asIter(obj);
+            check_type(frame->top(), tp_ref);
+            PyIter_AS_C(iter)->loop_var = frame->pop();
+            frame->push(std::move(iter));
         } continue;
         case OP_FOR_ITER: {
             auto& it = PyIter_AS_C(frame->top());
             PyVar obj = it->next();
             if(obj != nullptr){
-                PyRef_AS_C(it->var)->set(this, frame, std::move(obj));
+                PyRef_AS_C(it->loop_var)->set(this, frame, std::move(obj));
             }else{
                 int blockEnd = frame->co->blocks[byte.block].end;
                 frame->jump_abs_safe(blockEnd);

+ 5 - 0
src/frame.h

@@ -84,6 +84,11 @@ struct Frame {
         return _data.back();
     }
 
+    inline PyVar& top_1(){
+        if(_data.size() < 2) throw std::runtime_error("_data.size() < 2");
+        return _data[_data.size()-2];
+    }
+
     inline PyVar top_value_offset(VM* vm, int n){
         PyVar value = _data[_data.size() + n];
         try_deref(vm, value);

+ 1 - 1
src/obj.h

@@ -71,7 +71,7 @@ protected:
     PyVar _ref;     // keep a reference to the object so it will not be deleted while iterating
 public:
     virtual PyVar next() = 0;
-    PyVarRef var;
+    PyVarRef loop_var;
     BaseIter(VM* vm, PyVar _ref) : vm(vm), _ref(_ref) {}
     virtual ~BaseIter() = default;
 };