diff --git a/runtime/src/message_processor.rs b/runtime/src/message_processor.rs index 9984e8912f..756934e6e0 100644 --- a/runtime/src/message_processor.rs +++ b/runtime/src/message_processor.rs @@ -1258,6 +1258,9 @@ impl MessageProcessor { account_db, ancestors, ); + let pre_remaining_units = invoke_context.get_compute_meter().borrow().get_remaining(); + let mut time = Measure::start("execute_instruction"); + self.process_instruction(program_id, &instruction.data, &mut invoke_context)?; Self::verify( message, @@ -1272,6 +1275,14 @@ impl MessageProcessor { invoke_context.is_feature_active(&demote_program_write_locks::id()), )?; + time.stop(); + let post_remaining_units = invoke_context.get_compute_meter().borrow().get_remaining(); + + let program_timing = timings.per_program_timings.entry(*program_id).or_default(); + program_timing.accumulated_us += time.as_us(); + program_timing.accumulated_units += pre_remaining_units - post_remaining_units; + program_timing.count += 1; + timings.accumulate(&invoke_context.timings); Ok(()) @@ -1299,8 +1310,6 @@ impl MessageProcessor { ancestors: &Ancestors, ) -> Result<(), TransactionError> { for (instruction_index, instruction) in message.instructions.iter().enumerate() { - let mut time = Measure::start("execute_instruction"); - let pre_remaining_units = compute_meter.borrow().get_remaining(); let instruction_recorder = instruction_recorders .as_ref() .map(|recorders| recorders[instruction_index].clone()); @@ -1323,14 +1332,6 @@ impl MessageProcessor { ancestors, ) .map_err(|err| TransactionError::InstructionError(instruction_index as u8, err)); - time.stop(); - let post_remaining_units = compute_meter.borrow().get_remaining(); - - let program_id = instruction.program_id(&message.account_keys); - let program_timing = timings.per_program_timings.entry(*program_id).or_default(); - program_timing.accumulated_us += time.as_us(); - program_timing.accumulated_units += pre_remaining_units - post_remaining_units; - program_timing.count += 1; err?; }