This repository has been archived on 2023-02-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-benchmark-bundle/benchmark/foundation/stats.py
Sergey Sharybin c41658857a Various fixes
- Do not enable CPU device together with OpenCL/CUDA when device name is not
  specified.
- Adopt output log parser fr the changed path tracing message.
- Solve issue with using same short name of command line argument for single
  device specification.
- Reshuffle include statements so it's kind of possible to use bundle python.
  Still need to work this properly, but that's for later.
2017-11-01 16:07:46 +01:00

89 lines
3.5 KiB
Python

import re
from foundation import util
class Stats:
def __init__(self):
# Pepare some regex for parsing
self.re_path_tracing = re.compile(
".*Rendered ([0-9]+)/([0-9]+) Tiles" +
"(, Sample ([0-9]+)\/([0-9]+))?$")
self.re_total_render_time = re.compile(
".*Total render time: ([0-9]+(\.[0-9]+)?)")
self.re_render_time_no_sync = re.compile(
".*Render time \(without synchronization\): ([0-9]+(\.[0-9]+)?)")
self.re_pipeline_time = re.compile(
"Time: ([0-9:\.]+) \(Saving: ([0-9:\.]+)\)")
self.re_cycles_memory = re.compile(
".*\| Mem:([0-9.]+[KM]?), Peak:([0-9.]+[KM]?) \|.*")
# Render time stats.
self.total_render_time = "N/A"
self.render_time_no_sync = "N/A"
self.pipeline_render_time = "N/A"
# Render memory stats.
self.device_peak_memory = "N/A"
self.device_memory_usage = "N/A"
# Current stats.
self.current_tiles = 0
self.total_tiles = 0
def update(self, line):
# Current tile progress.
match = self.re_path_tracing.match(line)
if match:
self.current_tiles = int(match.group(1))
self.total_tiles = int(match.group(2))
# Total render time.
match = self.re_total_render_time.match(line)
if match:
self.total_render_time = float(match.group(1))
# Render time without sync.
match = self.re_render_time_no_sync.match(line)
if match:
self.render_time_no_sync = float(match.group(1))
# Total pipeline time.
match = self.re_pipeline_time.match(line)
if match:
self.pipeline_render_time = \
util.humanReadableTimeToSeconds(match.group(1))
# Memory usage.
match = self.re_cycles_memory.match(line)
if match:
mem = util.humanReadableSizeToMegabytes(match.group(1))
peak = util.humanReadableSizeToMegabytes(match.group(1))
if self.device_memory_usage == "N/A" or \
mem > self.device_memory_usage:
self.device_memory_usage = mem
if self.device_peak_memory == "N/A" or \
mem > self.device_peak_memory:
self.device_peak_memory = mem
def print(self):
# TODO(sergey): Check that all stats are available.
print("Total pipeline render time: {} ({} sec)"
. format(util.humanReadableTimeDifference(
self.pipeline_render_time),
self.pipeline_render_time))
print("Total Cycles render time: {} ({} sec)"
. format(util.humanReadableTimeDifference(
self.total_render_time),
self.total_render_time))
print("Pure Cycles render time (without sync): {} ({} sec)"
. format(util.humanReadableTimeDifference(
self.render_time_no_sync),
self.render_time_no_sync))
print("Cycles memoty usage: {} ({} peak)"
. format(self.device_memory_usage,
self.device_peak_memory))
def asDict(self):
return {'total_render_time': self.total_render_time,
'render_time_no_sync': self.render_time_no_sync,
'pipeline_render_time': self.pipeline_render_time,
'device_peak_memory': self.device_peak_memory,
'device_memory_usage': self.device_memory_usage}