Construct LocalVariableAccess

Performance Diagrams

Construct LocalVariableAccess 00100000010000002000000200000030000003000000400000040000005000000500000060000006000000CPython 2.7Nuitka (master)Nuitka (develop)Nuitka (factory)662770589.78846153846155257.0CPython 2.72850100244.59615384615387397.84880248894603Nuitka (master)2850100399.4038461538462397.84880248894603Nuitka (develop)2850100554.2115384615385397.84880248894603Nuitka (factory)Construct LocalVariableAccessTicks Construct LocalVariableAccess 0010000001000000200000020000003000000300000040000004000000500000050000006000000600000070000007000000CPython 3.8Nuitka (master)Nuitka (develop)Nuitka (factory)787276089.78846153846155257.0CPython 3.84600190244.59615384615387359.72158610585984Nuitka (master)4600184399.4038461538462359.7217744378181Nuitka (develop)4600184554.2115384615385359.7217744378181Nuitka (factory)Construct LocalVariableAccessTicks

Source Code with Construct

module_value1 = 1000
module_value2 = None
module_value3 = None

def calledRepeatedly():
    # Force frame and eliminate forward propagation (currently).
    module_value1

    local_value = module_value1

    # Use writing to global variable as access method.
    global module_value2, module_value3

# construct_begin
    module_value2 = local_value
# construct_end

    module_value3 = local_value

import itertools
for x in itertools.repeat(None, 50000):
    calledRepeatedly()

print("OK.")

Source Code without Construct

module_value1 = 1000
module_value2 = None
module_value3 = None

def calledRepeatedly():
    # Force frame and eliminate forward propagation (currently).
    module_value1

    local_value = module_value1

    # Use writing to global variable as access method.
    global module_value2, module_value3

# construct_begin



    module_value3 = local_value

import itertools
for x in itertools.repeat(None, 50000):
    calledRepeatedly()

print("OK.")

Context Diff of Source Code


Construct
Baseline
29 29
30     # Use writing to global variable as access method. 30     # Use writing to global variable as access method.
31     global module_value2, module_value3 31     global module_value2, module_value3
32 32
33 # construct_begin 33 # construct_begin
t 34     module_value2 = local_value t 34  
35 # construct_end 35  
36 36
37     module_value3 = local_value 37     module_value3 = local_value
38 38
39 import itertools 39 import itertools
40 for x in itertools.repeat(None, 50000): 40 for x in itertools.repeat(None, 50000):

Context Diff of Generated Code


Construct
Baseline
82 static PyCodeObject *codeobj_4334827bb7fee333ce33d94f0370f1d4; 82 static PyCodeObject *codeobj_4334827bb7fee333ce33d94f0370f1d4;
83 /* For use in "MainProgram.c". */ 83 /* For use in "MainProgram.c". */
84 PyCodeObject *codeobj_main = NULL; 84 PyCodeObject *codeobj_main = NULL;
85 85
86 static void createModuleCodeObjects(void) { 86 static void createModuleCodeObjects(void) {
n 87     module_filename_obj = mod_consts[4]; CHECK_OBJECT(module_filename_obj); n 87     module_filename_obj = mod_consts[3]; CHECK_OBJECT(module_filename_obj);
88     codeobj_80645a6dd1be5679eb5aad410eb0f716 = MAKE_CODEOBJECT(module_filename_obj, 1, CO_NOFREE, mod_consts[17], NULL, NULL, 0, 0, 0); 88     codeobj_80645a6dd1be5679eb5aad410eb0f716 = MAKE_CODEOBJECT(module_filename_obj, 1, CO_NOFREE, mod_consts[17], NULL, NULL, 0, 0, 0);
89     codeobj_4334827bb7fee333ce33d94f0370f1d4 = MAKE_CODEOBJECT(module_filename_obj, 24, CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE, mod_consts[9], mod_consts[18], NULL, 0, 0, 0); 89     codeobj_4334827bb7fee333ce33d94f0370f1d4 = MAKE_CODEOBJECT(module_filename_obj, 24, CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE, mod_consts[9], mod_consts[18], NULL, 0, 0, 0);
90 } 90 }
91 91
92 // The module function declarations. 92 // The module function declarations.
239     { 239     {
240         PyObject *tmp_assign_source_2; 240         PyObject *tmp_assign_source_2;
241         CHECK_OBJECT(var_local_value); 241         CHECK_OBJECT(var_local_value);
242         tmp_assign_source_2 = var_local_value; 242         tmp_assign_source_2 = var_local_value;
243         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[1], tmp_assign_source_2); 243         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[1], tmp_assign_source_2);
n 244     } n
245     {
246         PyObject *tmp_assign_source_3;
247         CHECK_OBJECT(var_local_value);
248         tmp_assign_source_3 = var_local_value;
249         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[2], tmp_assign_source_3);
250     } 244     }
251     tmp_return_value = Py_None; 245     tmp_return_value = Py_None;
252     Py_INCREF(tmp_return_value); 246     Py_INCREF(tmp_return_value);
253     goto try_return_handler_1; 247     goto try_return_handler_1;
254     NUITKA_CANNOT_GET_HERE("tried codes exits in all cases"); 248     NUITKA_CANNOT_GET_HERE("tried codes exits in all cases");
682 676
683     // Module code. 677     // Module code.
684     { 678     {
685         PyObject *tmp_assign_source_1; 679         PyObject *tmp_assign_source_1;
686         tmp_assign_source_1 = Py_None; 680         tmp_assign_source_1 = Py_None;
n 687         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[3], tmp_assign_source_1); n 681         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[2], tmp_assign_source_1);
688     } 682     }
689     { 683     {
690         PyObject *tmp_assign_source_2; 684         PyObject *tmp_assign_source_2;
n 691         tmp_assign_source_2 = mod_consts[4]; n 685         tmp_assign_source_2 = mod_consts[3];
692         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[5], tmp_assign_source_2); 686         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[4], tmp_assign_source_2);
693     } 687     }
694     { 688     {
695         PyObject *tmp_assign_source_3; 689         PyObject *tmp_assign_source_3;
696         tmp_assign_source_3 = Py_None; 690         tmp_assign_source_3 = Py_None;
n 697         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[6], tmp_assign_source_3); n 691         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[5], tmp_assign_source_3);
698     } 692     }
699     { 693     {
700         PyObject *tmp_assign_source_4; 694         PyObject *tmp_assign_source_4;
701         tmp_assign_source_4 = PyDict_New(); 695         tmp_assign_source_4 = PyDict_New();
n 702         UPDATE_STRING_DICT1(moduledict___main__, (Nuitka_StringObject *)mod_consts[7], tmp_assign_source_4); n 696         UPDATE_STRING_DICT1(moduledict___main__, (Nuitka_StringObject *)mod_consts[6], tmp_assign_source_4);
703     } 697     }
704     { 698     {
705         PyObject *tmp_assign_source_5; 699         PyObject *tmp_assign_source_5;
n 706         tmp_assign_source_5 = mod_consts[8]; n 700         tmp_assign_source_5 = mod_consts[7];
707         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[0], tmp_assign_source_5); 701         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[0], tmp_assign_source_5);
708     } 702     }
709     { 703     {
710         PyObject *tmp_assign_source_6; 704         PyObject *tmp_assign_source_6;
711         tmp_assign_source_6 = Py_None; 705         tmp_assign_source_6 = Py_None;
n 712         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[1], tmp_assign_source_6); n 706         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[8], tmp_assign_source_6);
713     } 707     }
714     { 708     {
715         PyObject *tmp_assign_source_7; 709         PyObject *tmp_assign_source_7;
716         tmp_assign_source_7 = Py_None; 710         tmp_assign_source_7 = Py_None;
t 717         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[2], tmp_assign_source_7); t 711         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[1], tmp_assign_source_7);
718     } 712     }
719     { 713     {
720         PyObject *tmp_assign_source_8; 714         PyObject *tmp_assign_source_8;
721 715
722 716