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 7f42fdf5e8 Initial implementation of blender benchmark addon
Just some glue logic to query progress and results from benchmark.

Needed to move files around, so oth standalone and addon are happy.
2018-08-02 17:38:55 +02:00

89 lines
3.5 KiB
Python

import re
from . import util
class Stats:
def __init__(self):
# Pepare some regex for parsing
self.re_path_tracing = re.compile(
".*(Rendered|Path Tracing Tile) ([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(2))
self.total_tiles = int(match.group(3))
# 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}