Construct InplaceOperationTupleAdd

Performance Diagrams

Construct InplaceOperationTupleAdd 0020000002000000400000040000006000000600000080000008000000100000001000000012000000120000001400000014000000160000001600000018000000180000002000000020000000220000002200000024000000240000002600000026000000CPython 2.7Nuitka (master)Nuitka (develop)Nuitka (factory)2749053288.95192307692307257.0CPython 2.715501208242.31730769230768364.77333852755055Nuitka (master)15501575395.6826923076923364.770039524601Nuitka (develop)15501216549.0480769230769364.77326661467976Nuitka (factory)Construct InplaceOperationTupleAddTicks Construct InplaceOperationTupleAdd 00200000020000004000000400000060000006000000800000080000001000000010000000120000001200000014000000140000001600000016000000180000001800000020000000200000002200000022000000CPython 3.5Nuitka (master)Nuitka (develop)Nuitka (factory)2217796488.95192307692307257.0CPython 3.514651667242.31730769230768340.8608890286149Nuitka (master)14694956395.6826923076923340.37854638054245Nuitka (develop)14702120549.0480769230769340.2987223437019Nuitka (factory)Construct InplaceOperationTupleAddTicks

Source Code with Construct

module_value1 = (5.0,)
module_value2 = (3.0,)

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

    # Make sure we have a local variable s anyway
    s = (2.0,)

    local_value = module_value1

    s += module_value1
# construct_begin
    s += (1000.0,)
# construct_end
    s += module_value2

    return s

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

print("OK.")

Source Code without Construct

module_value1 = (5.0,)
module_value2 = (3.0,)

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

    # Make sure we have a local variable s anyway
    s = (2.0,)

    local_value = module_value1

    s += module_value1
# construct_begin


    s += module_value2

    return s

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

print("OK.")

Context Diff of Source Code


Construct
Baseline
30 30
31     local_value = module_value1 31     local_value = module_value1
32 32
33     s += module_value1 33     s += module_value1
34 # construct_begin 34 # construct_begin
t 35     s += (1000.0,) t 35  
36 # construct_end 36  
37     s += module_value2 37     s += module_value2
38 38
39     return s 39     return s
40 40
41 import itertools 41 import itertools

Context Diff of Generated Code


Construct
Baseline
43 static PyObject *const_str_plain_module_value2; 43 static PyObject *const_str_plain_module_value2;
44 static PyObject *const_tuple_float_2_0_tuple; 44 static PyObject *const_tuple_float_2_0_tuple;
45 static PyObject *const_tuple_str_digest_5ed1392909ad16e6227b8230f4582352_tuple; 45 static PyObject *const_tuple_str_digest_5ed1392909ad16e6227b8230f4582352_tuple;
46 static PyObject *const_str_plain_module_value1; 46 static PyObject *const_str_plain_module_value1;
47 static PyObject *const_tuple_str_plain_s_str_plain_local_value_tuple; 47 static PyObject *const_tuple_str_plain_s_str_plain_local_value_tuple;
n 48 static PyObject *const_tuple_float_1000_0_tuple; n
49 static PyObject *const_str_plain_calledRepeatedly; 48 static PyObject *const_str_plain_calledRepeatedly;
n 50 static PyObject *const_float_1000_0; n
51 static PyObject *const_str_angle_module; 49 static PyObject *const_str_angle_module;
52 static PyObject *const_str_plain_None; 50 static PyObject *const_str_plain_None;
53 static PyObject *const_tuple_float_5_0_tuple; 51 static PyObject *const_tuple_float_5_0_tuple;
54 static PyObject *const_str_plain_x; 52 static PyObject *const_str_plain_x;
55 extern PyObject *const_tuple_empty; 53 extern PyObject *const_tuple_empty;
82     PyTuple_SET_ITEM( const_tuple_str_digest_5ed1392909ad16e6227b8230f4582352_tuple, 0, const_str_digest_5ed1392909ad16e6227b8230f4582352 ); Py_INCREF( const_str_digest_5ed1392909ad16e6227b8230f4582352 ); 80     PyTuple_SET_ITEM( const_tuple_str_digest_5ed1392909ad16e6227b8230f4582352_tuple, 0, const_str_digest_5ed1392909ad16e6227b8230f4582352 ); Py_INCREF( const_str_digest_5ed1392909ad16e6227b8230f4582352 );
83     const_str_plain_module_value1 = UNSTREAM_STRING_ASCII( &constant_bin[ 52 ], 13, 1 ); 81     const_str_plain_module_value1 = UNSTREAM_STRING_ASCII( &constant_bin[ 52 ], 13, 1 );
84     const_tuple_str_plain_s_str_plain_local_value_tuple = PyTuple_New( 2 ); 82     const_tuple_str_plain_s_str_plain_local_value_tuple = PyTuple_New( 2 );
85     PyTuple_SET_ITEM( const_tuple_str_plain_s_str_plain_local_value_tuple, 0, const_str_plain_s ); Py_INCREF( const_str_plain_s ); 83     PyTuple_SET_ITEM( const_tuple_str_plain_s_str_plain_local_value_tuple, 0, const_str_plain_s ); Py_INCREF( const_str_plain_s );
86     PyTuple_SET_ITEM( const_tuple_str_plain_s_str_plain_local_value_tuple, 1, const_str_plain_local_value ); Py_INCREF( const_str_plain_local_value ); 84     PyTuple_SET_ITEM( const_tuple_str_plain_s_str_plain_local_value_tuple, 1, const_str_plain_local_value ); Py_INCREF( const_str_plain_local_value );
n 87     const_tuple_float_1000_0_tuple = PyTuple_New( 1 ); n
88     const_float_1000_0 = UNSTREAM_FLOAT( &constant_bin[ 65 ] );
89     PyTuple_SET_ITEM( const_tuple_float_1000_0_tuple, 0, const_float_1000_0 ); Py_INCREF( const_float_1000_0 );
90     const_str_plain_calledRepeatedly = UNSTREAM_STRING_ASCII( &constant_bin[ 73 ], 16, 1 ); 85     const_str_plain_calledRepeatedly = UNSTREAM_STRING_ASCII( &constant_bin[ 65 ], 16, 1 );
91     const_str_angle_module = UNSTREAM_STRING_ASCII( &constant_bin[ 89 ], 8, 0 ); 86     const_str_angle_module = UNSTREAM_STRING_ASCII( &constant_bin[ 81 ], 8, 0 );
92     const_str_plain_None = UNSTREAM_STRING_ASCII( &constant_bin[ 97 ], 4, 1 ); 87     const_str_plain_None = UNSTREAM_STRING_ASCII( &constant_bin[ 89 ], 4, 1 );
93     const_tuple_float_5_0_tuple = PyTuple_New( 1 ); 88     const_tuple_float_5_0_tuple = PyTuple_New( 1 );
94     PyTuple_SET_ITEM( const_tuple_float_5_0_tuple, 0, const_float_5_0 ); Py_INCREF( const_float_5_0 ); 89     PyTuple_SET_ITEM( const_tuple_float_5_0_tuple, 0, const_float_5_0 ); Py_INCREF( const_float_5_0 );
n 95     const_str_plain_x = UNSTREAM_STRING_ASCII( &constant_bin[ 101 ], 1, 1 ); n 90     const_str_plain_x = UNSTREAM_STRING_ASCII( &constant_bin[ 93 ], 1, 1 );
96     const_str_plain_repeat = UNSTREAM_STRING_ASCII( &constant_bin[ 102 ], 6, 1 ); 91     const_str_plain_repeat = UNSTREAM_STRING_ASCII( &constant_bin[ 94 ], 6, 1 );
97     const_str_digest_1aa81d2121a74751cbc72e08fc106c79 = UNSTREAM_STRING_ASCII( &constant_bin[ 108 ], 75, 0 ); 92     const_str_digest_1aa81d2121a74751cbc72e08fc106c79 = UNSTREAM_STRING_ASCII( &constant_bin[ 100 ], 75, 0 );
98     const_tuple_none_int_pos_50000_tuple = PyTuple_New( 2 ); 93     const_tuple_none_int_pos_50000_tuple = PyTuple_New( 2 );
99     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 0, Py_None ); Py_INCREF( Py_None ); 94     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 0, Py_None ); Py_INCREF( Py_None );
100     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 1, const_int_pos_50000 ); Py_INCREF( const_int_pos_50000 ); 95     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 1, const_int_pos_50000 ); Py_INCREF( const_int_pos_50000 );
n 101     const_float_3_0 = UNSTREAM_FLOAT( &constant_bin[ 183 ] ); n 96     const_float_3_0 = UNSTREAM_FLOAT( &constant_bin[ 175 ] );
102     const_tuple_float_3_0_tuple = PyTuple_New( 1 ); 97     const_tuple_float_3_0_tuple = PyTuple_New( 1 );
103     PyTuple_SET_ITEM( const_tuple_float_3_0_tuple, 0, const_float_3_0 ); Py_INCREF( const_float_3_0 ); 98     PyTuple_SET_ITEM( const_tuple_float_3_0_tuple, 0, const_float_3_0 ); Py_INCREF( const_float_3_0 );
104 99
105     constants_created = true; 100     constants_created = true;
106 } 101 }
274     } 269     }
275     { 270     {
276     PyObject *tmp_assign_source_3; 271     PyObject *tmp_assign_source_3;
277     PyObject *tmp_left_name_2; 272     PyObject *tmp_left_name_2;
278     PyObject *tmp_right_name_2; 273     PyObject *tmp_right_name_2;
n n 274     PyObject *tmp_mvar_value_4;
279     CHECK_OBJECT( var_s ); 275     CHECK_OBJECT( var_s );
280     tmp_left_name_2 = var_s; 276     tmp_left_name_2 = var_s;
n 281     tmp_right_name_2 = const_tuple_float_1000_0_tuple; n
282     tmp_result = BINARY_OPERATION_ADD_OBJECT_TUPLE_INPLACE( &tmp_left_name_2, tmp_right_name_2 );
283     if ( tmp_result == false )
284     {
285         assert( ERROR_OCCURRED() );
286  
287         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
288  
289  
290         exception_lineno = 35;
291         type_description_1 = "oo";
292         goto frame_exception_exit_1;
293     }
294     tmp_assign_source_3 = tmp_left_name_2;
295     var_s = tmp_assign_source_3;
296  
297     }
298     {
299     PyObject *tmp_assign_source_4;
300     PyObject *tmp_left_name_3;
301     PyObject *tmp_right_name_3;
302     PyObject *tmp_mvar_value_4;
303     CHECK_OBJECT( var_s );
304     tmp_left_name_3 = var_s;
305     tmp_mvar_value_4 = GET_STRING_DICT_VALUE( moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value2 ); 277     tmp_mvar_value_4 = GET_STRING_DICT_VALUE( moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value2 );
306 278
307     if (unlikely( tmp_mvar_value_4 == NULL )) 279     if (unlikely( tmp_mvar_value_4 == NULL ))
308     { 280     {
309         tmp_mvar_value_4 = GET_STRING_DICT_VALUE( dict_builtin, (Nuitka_StringObject *)const_str_plain_module_value2 ); 281         tmp_mvar_value_4 = GET_STRING_DICT_VALUE( dict_builtin, (Nuitka_StringObject *)const_str_plain_module_value2 );
322         exception_lineno = 37; 294         exception_lineno = 37;
323         type_description_1 = "oo"; 295         type_description_1 = "oo";
324         goto frame_exception_exit_1; 296         goto frame_exception_exit_1;
325     } 297     }
326 298
n 327     tmp_right_name_3 = tmp_mvar_value_4; n 299     tmp_right_name_2 = tmp_mvar_value_4;
328     tmp_result = BINARY_OPERATION_ADD_OBJECT_OBJECT_INPLACE( &tmp_left_name_3, tmp_right_name_3 ); 300     tmp_result = BINARY_OPERATION_ADD_OBJECT_OBJECT_INPLACE( &tmp_left_name_2, tmp_right_name_2 );
329     if ( tmp_result == false ) 301     if ( tmp_result == false )
330     { 302     {
331         assert( ERROR_OCCURRED() ); 303         assert( ERROR_OCCURRED() );
332 304
333         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 305         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
335 307
336         exception_lineno = 37; 308         exception_lineno = 37;
337         type_description_1 = "oo"; 309         type_description_1 = "oo";
338         goto frame_exception_exit_1; 310         goto frame_exception_exit_1;
339     } 311     }
t 340     tmp_assign_source_4 = tmp_left_name_3; t 312     tmp_assign_source_3 = tmp_left_name_2;
341     var_s = tmp_assign_source_4; 313     var_s = tmp_assign_source_3;
342 314
343     } 315     }
344 316
345 #if 0 317 #if 0
346     RESTORE_FRAME_EXCEPTION( frame_9096e264a8292b075ce70d18fabc377f ); 318     RESTORE_FRAME_EXCEPTION( frame_9096e264a8292b075ce70d18fabc377f );