Just some glue logic to query progress and results from benchmark. Needed to move files around, so oth standalone and addon are happy.
89 lines
3.5 KiB
Python
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}
|