Construct LocalVariableAccess

Performance Diagrams

Construct LocalVariableAccess 00100000010000002000000200000030000003000000400000040000005000000500000060000006000000CPython 2.7Nuitka (main)Nuitka (develop)Nuitka (factory)662770589.78846153846155257.0CPython 2.72850093244.59615384615387397.8490634854286Nuitka (main)2850093399.4038461538462397.8490634854286Nuitka (develop)2850093554.2115384615385397.8490634854286Nuitka (factory)Construct LocalVariableAccessTicks Construct LocalVariableAccess 0010000001000000200000020000003000000300000040000004000000500000050000006000000600000070000007000000CPython 3.8Nuitka (main)Nuitka (develop)Nuitka (factory)787276089.78846153846155257.0CPython 3.84600300244.59615384615387359.7181333532918Nuitka (main)4600300399.4038461538462359.7181333532918Nuitka (develop)4600300554.2115384615385359.7181333532918Nuitka (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_3a19bddae5f66391c237585565d94a79; 82 static PyCodeObject *codeobj_3a19bddae5f66391c237585565d94a79;
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_f5370255da3058ba2bb14ba281609ade = MAKE_CODEOBJECT(module_filename_obj, 1, CO_NOFREE, mod_consts[17], NULL, NULL, 0, 0, 0); 88     codeobj_f5370255da3058ba2bb14ba281609ade = MAKE_CODEOBJECT(module_filename_obj, 1, CO_NOFREE, mod_consts[17], NULL, NULL, 0, 0, 0);
89     codeobj_3a19bddae5f66391c237585565d94a79 = MAKE_CODEOBJECT(module_filename_obj, 24, CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE, mod_consts[9], mod_consts[18], NULL, 0, 0, 0); 89     codeobj_3a19bddae5f66391c237585565d94a79 = 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");
687 681
688     // Module code. 682     // Module code.
689     { 683     {
690         PyObject *tmp_assign_source_1; 684         PyObject *tmp_assign_source_1;
691         tmp_assign_source_1 = Py_None; 685         tmp_assign_source_1 = Py_None;
n 692         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[3], tmp_assign_source_1); n 686         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[2], tmp_assign_source_1);
693     } 687     }
694     { 688     {
695         PyObject *tmp_assign_source_2; 689         PyObject *tmp_assign_source_2;
n 696         tmp_assign_source_2 = mod_consts[4]; n 690         tmp_assign_source_2 = mod_consts[3];
697         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[5], tmp_assign_source_2); 691         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[4], tmp_assign_source_2);
698     } 692     }
699     { 693     {
700         PyObject *tmp_assign_source_3; 694         PyObject *tmp_assign_source_3;
701         tmp_assign_source_3 = Py_None; 695         tmp_assign_source_3 = Py_None;
n 702         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[6], tmp_assign_source_3); n 696         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[5], tmp_assign_source_3);
703     } 697     }
704     { 698     {
705         PyObject *tmp_assign_source_4; 699         PyObject *tmp_assign_source_4;
706         tmp_assign_source_4 = PyDict_New(); 700         tmp_assign_source_4 = PyDict_New();
n 707         UPDATE_STRING_DICT1(moduledict___main__, (Nuitka_StringObject *)mod_consts[7], tmp_assign_source_4); n 701         UPDATE_STRING_DICT1(moduledict___main__, (Nuitka_StringObject *)mod_consts[6], tmp_assign_source_4);
708     } 702     }
709     { 703     {
710         PyObject *tmp_assign_source_5; 704         PyObject *tmp_assign_source_5;
n 711         tmp_assign_source_5 = mod_consts[8]; n 705         tmp_assign_source_5 = mod_consts[7];
712         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[0], tmp_assign_source_5); 706         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[0], tmp_assign_source_5);
713     } 707     }
714     { 708     {
715         PyObject *tmp_assign_source_6; 709         PyObject *tmp_assign_source_6;
716         tmp_assign_source_6 = Py_None; 710         tmp_assign_source_6 = Py_None;
n 717         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[1], tmp_assign_source_6); n 711         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[8], tmp_assign_source_6);
718     } 712     }
719     { 713     {
720         PyObject *tmp_assign_source_7; 714         PyObject *tmp_assign_source_7;
721         tmp_assign_source_7 = Py_None; 715         tmp_assign_source_7 = Py_None;
t 722         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[2], tmp_assign_source_7); t 716         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)mod_consts[1], tmp_assign_source_7);
723     } 717     }
724     { 718     {
725         PyObject *tmp_assign_source_8; 719         PyObject *tmp_assign_source_8;
726 720
727 721