nasa / trick

Trick Simulation Environment. Trick provides a common set of simulation capabilities and utilities to build simulations automatically.
Other
34 stars 19 forks source link

Recommended performance enhancement when using STL iterators. #1594

Closed dandexter closed 4 months ago

dandexter commented 11 months ago

The performance of STL iterators can be greatly improved by using pre-increment versus post-increment. A pre-increment operator can typically be done in place while a post- increment will create a temporary copy to be used for operations before it is incremented.

Trick uses post-increment on several iterators and performance can be improved by using pre-increment instead.

Here is a good article on the subject that also gives some performance improvement numbers: http://antonym.org/2008/05/stl-iterators-and-performance.html

dandexter commented 11 months ago

This is not an exhaustive search, but a simple grep search found 130 instances of the Trick code using a post-incremented STL iterator.

trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp: for ( cit = rec->ctor_begin() ; cit != rec->ctor_end() ; cit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = exclude_dirs.begin() ; vit != exclude_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = icg_exclude_dirs.begin() ; vit != icg_exclude_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = ext_lib_dirs.begin() ; vit != ext_lib_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = icg_nocomment_dirs.begin() ; vit != icg_nocomment_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = compat15_dirs.begin() ; vit != compat15_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = exclude_dirs.begin() ; vit != exclude_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = icg_exclude_dirs.begin() ; vit != icg_exclude_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp: for ( vit = ext_lib_dirs.begin() ; vit != ext_lib_dirs.end() ; vit++ ) { trick_source/codegen/Interface_Code_Gen/CommentSaver.cpp: for ( cit = comment_map[resolved_path].begin() ; cit != comment_map[resolved_path].end() ; cit++ ) { trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp: for ( it = included_files.begin() ; it != included_files.end() ; it++ ) { trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp: for ( it = included_files.begin() ; it != included_files.end() ; it++ ) { trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp: for ( it = included_files.begin() ; it != included_files.end() ; it++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; fdit++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( fdit = in_fdes.begin() ; fdit != in_fdes.end() ; fdit++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( fdit = in_fdes.begin() ; fdit != in_fdes.end() ; fdit++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( mit = in_cv->all_inherited_class_names_map.begin() ; mit != in_cv->all_inherited_class_names_map.end() ; mit++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; fdit++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( mit = all_inherited_class_names_map.begin() ; mit != all_inherited_class_names_map.end() ; mit++ ) { trick_source/codegen/Interface_Code_Gen/ClassValues.cpp: for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; fdit++ ) { trick_source/codegen/Interface_Code_Gen/FieldVisitor.cpp: for ( std::map<std::string, bool>::iterator it = stl_classes.begin() ; it != stl_classes.end() ; it++ ) { trick_source/codegen/Interface_Code_Gen/FieldDescription.cpp: for (std::string::iterator it = comment.begin(); it != comment.end(); it++) { trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp: for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; mit++ ) { trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp: for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; mit++ ) { trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp: for ( it = icg_no_files.begin() ; it != icg_no_files.end() ; it++ ) { trick_source/dataproducts/Log/log.cpp: (*iter1)++ ; trick_source/dataproducts/Log/log.cpp: (*iter2)++ ; trick_source/dataproducts/Log/multiLog.cpp: for (lg = iterLogGroups.begin(); lg != iterLogGroups_.end(); lg++) { trick_source/dataproducts/Log/multiLog.cpp: for (lg = iterLogGroups.begin(); lg != iterLogGroups_.end(); lg++) { trick_source/dataproducts/Log/multiLog.cpp: for (lg = iterLogGroups.begin(); lg != iterLogGroups_.end(); lg++) { trick_source/dataproducts/Log/multiLog.cpp: ili != listLogGroupIterators.end(); ili++) { trick_source/sim_services/InputProcessor/IPPython.cpp: for ( aim_it = trick_MM->alloc_info_map_begin() ; aim_it != trick_MM->alloc_info_map_end() ; aim_it++ ) { trick_source/sim_services/SimObject/SimObject.cpp: for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { trick_source/sim_services/SimObject/SimObject.cpp: for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { trick_source/sim_services/SimObject/SimObject.cpp: for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { trick_source/sim_services/SimObject/SimObject.cpp: for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { trick_source/sim_services/SimObject/SimObject.cpp: for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { trick_source/sim_services/Integrator/src/regula_falsi.c: R->iterations++; trick_source/sim_services/UnitTest/UnitTest.cpp: for ( it = test_results.begin() ; it != test_results.end() ; it++ ) { trick_source/sim_services/UnitTest/UnitTest.cpp: for ( it = test_suites.begin() ; it != test_suites.end() ; it++ ) { trick_source/sim_services/UnitTest/UnitTest.cpp: for ( it = test_suites.begin() ; it != test_suites.end() ; it++ ) { trick_source/sim_services/UnitTest/UnitTest.cpp: for ( it = test_suites.begin() ; it != test_suites.end() ; it++ ) { trick_source/sim_services/UnitTest/UnitTest.cpp: for ( jj = 0 ; jj < curr_suite->test_results.size() ; jj++ ) { trick_source/sim_services/RealtimeInjector/RtiList.cpp: for ( rebit = event_list.begin() ; rebit != event_list.end() ; rebit++ ) { trick_source/sim_services/RealtimeInjector/RtiList.cpp: for ( rebit = event_list.begin() ; rebit != event_list.end() ; rebit++ ) { trick_source/sim_services/RealtimeInjector/RtiExec.cpp: for ( rlit = fire_list.begin() ; rlit != fire_list.end() ; rlit++ ) { trick_source/sim_services/RealtimeInjector/RtiStager.cpp: for ( reit = executors.begin() ; reit != executors.end() ; reit++ ) { trick_source/sim_services/DataTypes/src/EnumDictionary.cpp: enumDictionaryIterator++ ) { trick_source/sim_services/DataTypes/src/TypeDictionary.cpp: typeDictionaryIterator++ ) { trick_source/sim_services/DataTypes/src/TypeDictionary.cpp: typeDictionaryIterator++ ) { trick_source/sim_services/DataTypes/src/TypeDictionary.cpp: typeDictionaryIterator++ ) { trick_source/sim_services/EventManager/EventProcessor.cpp: for (sit=event_set.begin(); sit!=event_set.end(); sit++) { trick_source/sim_services/EventManager/EventManager.cpp: ei_it++ ; trick_source/sim_services/Message/MessagePublisher.cpp: for ( lit = subscribers.begin() ; lit != subscribers.end() ; lit++ ) { trick_source/sim_services/Message/MessageTCDevice.cpp: it++ ; trick_source/sim_services/Message/MessageThreadedCout.cpp: for ( unsigned int ii = 1 ; ii < max_buffer_items ; ii++ ) { trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp: drg_it++ ; trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp: for ( it = groups.begin() ; it != groups.end() ; it++ ) { trick_source/sim_services/DataRecord/DataRecordGroup.cpp: for ( drb_it = rec_buffer.begin() ; drb_it != rec_buffer.end() ; drb_it++ ) { trick_source/sim_services/DataRecord/DataRecordGroup.cpp: for ( drb_it = change_buffer.begin() ; drb_it != change_buffer.end() ; drb_it++ ) { trick_source/sim_services/MemoryManager/MemoryManager_write_checkpoint.cpp: for ( it = stl_dependencies.rbegin() ; it != stl_dependencies.rend() ; it++ ) { trick_source/sim_services/MemoryManager/test/MM_stl_checkpoint.cc: for (auto it = recursive_nightmare_copy[i].begin(); it != recursive_nightmare_copy[i].end(); it++, j++) { trick_source/sim_services/MemoryManager/MemoryManager.cpp: for ( ait = alloc_info_map.begin() ; ait != alloc_info_map.end() ; ait++ ) { trick_source/sim_services/MemoryManager/MemoryManager_add_attr_info.cpp: for ( ii = 0 ; ii < dlhandles.size() && init_sub_attr == NULL ; ii++ ) { trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp: for ( it = rec_jobs.begin() ; it != rec_jobs.end() ; it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( fdrg_it = drg_users.begin() , ii = 0 ; fdrg_it != drg_users.end() ; fdrg_it++ , ii++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( it = drg_users.begin() ; it != drg_users.end() ; it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( it = drg_users.begin() ; it != drg_users.end() ; it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( it = drg_users.begin() ; it != drg_users.end() ; it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: for ( drb_it = drg_users[ii]->rec_buffer.begin() + 1 ; drb_it != drg_users[ii]->rec_buffer.end() ; drb_it++ ) { trick_source/sim_services/FrameLog/FrameLog.cpp: job_iterator++; trick_source/sim_services/JITInputFile/JITInputFile.cpp: for ( it = file_to_libinfo_map.begin() ; it != file_to_libinfo_map.end() ; it++ ) { trick_source/sim_services/Environment/Environment.cpp: for ( it = local_env.begin() ; it != local_env.end() ; it++ ) { trick_source/sim_services/Sie/AttributesMap.cpp: for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { trick_source/sim_services/Sie/AttributesMap.cpp: for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { trick_source/sim_services/Sie/Sie.cpp: for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; vit++ ) { trick_source/sim_services/Sie/Sie.cpp: for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; vit++ ) { trick_source/sim_services/Sie/Sie.cpp: for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; vit++ ) { trick_source/sim_services/Sie/EnumAttributesMap.cpp: for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { trick_source/sim_services/Sie/EnumAttributesMap.cpp: for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_copy_and_write_scheduled.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_get_next_sync_call_time.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer.cpp: for ( it = vs.var_server_threads.begin() ; it != vs.var_server_threads.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze_scheduled.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_copy_and_write_top.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_freeze_init.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/VariableServer/VariableServer_get_next_freeze_call_time.cpp: for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { trick_source/sim_services/UnitsMap/UnitsMap.cpp: for ( pit = param_units.begin() ; pit != param_units.end() ; pit++ ) { trick_source/sim_services/UdUnits/map_trick_units_to_udunits.cpp: for( it = tokens.begin() ; it != tokens.end() ; it++ ) { trick_source/sim_services/ExternalApplications/ExternalApplication.cpp: for(std::vector<char>::iterator it = allocations.begin(); it != allocations.end(); ++it) { trick_source/sim_services/JSONVariableServer/JSONVariableServerThread.cpp: for ( aim_it = trick_MM->alloc_info_map_begin() ; aim_it != trick_MM->alloc_info_map_end() ; aim_it++ ) { trick_source/sim_services/Executive/Executive_add_jobs_to_queue.cpp: for ( it = job->tags_begin() ; it != job->tags_end() ; it++ ) { trick_source/sim_services/Executive/Executive_set_job_cycle.cpp: for ( it = range.first; it != range.second ; it++ ) { trick_source/sim_services/Executive/Executive_remove_jobs.cpp: for ( std::vector <Trick::JobData >::iterator jit = in_sim_object->jobs.begin() ; jit != in_sim_object->jobs.end() ; jit++ ) { trick_source/sim_services/Executive/Executive_restart.cpp: for ( sit = sim_objects.begin() ; sit != sim_objects.end() ; sit++ ) { trick_source/sim_services/Executive/Executive_restart.cpp: for ( jit = (sit)->jobs.begin() ; jit != (sit)->jobs.end() ; jit++ ) { trick_source/sim_services/Executive/Executive_restart.cpp: for ( it = ret.first ; it != ret.second ; it++ ) { trick_source/sim_services/Executive/Executive_restart.cpp: for ( sit = sim_objects.begin() ; sit != sim_objects.end() ; sit++ ) { trick_source/sim_services/Executive/Executive_remove_sim_object.cpp: for ( so_it = in_object->pre_component_objects.begin() ; so_it != in_object->pre_component_objects.end() ; so_it++ ) { trick_source/sim_services/Executive/Executive_remove_sim_object.cpp: so_it++ ; trick_source/sim_services/Executive/Executive_remove_sim_object.cpp: for ( sched_it = other_schedulers.begin() ; sched_it != other_schedulers.end() ; sched_it++ ) { trick_source/sim_services/Executive/Executive_remove_sim_object.cpp: for ( so_it = in_object->post_component_objects.begin() ; so_it != in_object->post_component_objects.end() ; so_it++ ) { trick_source/sim_services/Executive/Executive_get_job.cpp: for ( it = range.first , ii = 1 ; (it != range.second) && (ii < j_instance) ; it++ , ii++ ) ; trick_source/sim_services/Executive/Executive_set_job_onoff.cpp: for ( it = range.first; it != range.second ; it++ ) { trick_source/trick_swig/PrimitiveAttributesMap.cpp: for ( pit = param_attr.begin() ; pit != param_attr.end() ; pit++ ) { trick_source/trick_utils/trick_adt/src/MapStrToPtr.c: for (i = 0; i < pIter->m_pTable->m_Size; i++) { / find the first list in the list array that has an element / trick_source/trick_utils/trick_adt/src/MapStrToPtr.c: pIter->m_Index++; trick_source/trick_utils/trick_adt/src/MapStrToPtr.c: pIter->m_Index++; / iterate through the list array / trick_source/trick_utils/SAIntegrator/src/RootFinder.cpp: iterations++; trick_source/trick_utils/math/src/eigen_ql.c: iter++; trick_source/trick_utils/units/src/units_conv.c: units->nt++; trick_source/web/CivetServer/src/MyCivetServer.cpp: for (iter = server->webSocketSessionMap.begin(); iter != server->webSocketSessionMap.end(); iter++ ) { trick_source/web/CivetServer/src/MyCivetServer.cpp: for (iter = webSocketSessionMap.begin(); iter != webSocketSessionMap.end(); iter++ ) { trick_source/web/CivetServer/src/VariableServerSession.cpp: for (it = sessionVariables.begin(); it != sessionVariables.end(); it++ ) { trick_source/web/CivetServer/src/VariableServerSession.cpp: for (it = members.begin(); it != members.end(); it++ ) { trick_source/web/CivetServer/src/VariableServerSession.cpp: for (it = sessionVariables.begin(); it != sessionVariables.end(); it++ ) { trick_source/web/CivetServer/src/VariableServerSession.cpp: for (it = sessionVariables.begin(); it != sessionVariables.end(); it++ ) { include/trick/checkpoint_map.hh: for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { include/trick/checkpoint_map.hh: for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { include/trick/checkpoint_map.hh: for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { include/trick/checkpoint_map.hh: for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { include/trick/checkpoint_sequence_stl.hh: for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { include/trick/checkpoint_sequence_stl.hh: for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { include/trick/ClassSizeCheck.hh: for ( it = name_to_diff.begin() ; it != name_to_diff.end() ; it++ ) {

sharmeye commented 11 months ago

This doesn't seem like it would take that long to find and correct, so we'll put it on our to-do list.

amishscientist commented 11 months ago

cppcheck is a good tool for finding these things performance: Prefer prefix ++/-- operators for non-primitive types. [postfixOperator]

[jborland@cabaodaba INIT_BUILD]$ awk '/performance/{print $NF}' cppcheck.out.out | sort -h | uniq -c | sort -rh 129 [postfixOperator] 47 [passedByValue] 23 [useInitializationList] 13 [useClearToEraseAString] 2 [stlIfStrFind] 2 [stlFindInsert]

sharmeye commented 4 months ago

Addressed in recent update