code: def _log_performance(self, perf_list):
          
          # Compute overall performance numbers.
          totalProgramTime = sum(perf.program_time for perf in perf_list)
          program_byte_count = sum(perf.total_byte_count for perf in perf_list)
          actual_program_byte_count = sum(perf.program_byte_count for perf in perf_list)
          actual_program_page_count = sum(perf.program_page_count for perf in perf_list)
          skipped_byte_count = sum(perf.skipped_byte_count for perf in perf_list)
          skipped_page_count = sum(perf.skipped_page_count for perf in perf_list)
          
          # Compute kbps while avoiding a potential zero-div error.
          if totalProgramTime == 0:
              kbps = 0
          else:
              kbps = (program_byte_count/1024) / totalProgramTime
          
          if any(perf.program_type == FlashBuilder.FLASH_CHIP_ERASE for perf in perf_list):
              LOG.info("Erased chip, programmed %d bytes (%s), skipped %d bytes (%s) at %.02f kB/s",
                  actual_program_byte_count, get_page_count(actual_program_page_count),
                  skipped_byte_count, get_page_count(skipped_page_count),
                  kbps)
          else:
              erase_byte_count = sum(perf.erase_byte_count for perf in perf_list)
              erase_sector_count = sum(perf.erase_sector_count for perf in perf_list)
  
              LOG.info("Erased %d bytes (%s), programmed %d bytes (%s), skipped %d bytes (%s) at %.02f kB/s", 
                  erase_byte_count, get_sector_count(erase_sector_count),
                  actual_program_byte_count, get_page_count(actual_program_page_count),
                  skipped_byte_count, get_page_count(skipped_page_count),
                  kbps)
docs: ! @brief Log a report of programming performance numbers.