Source code for obci.configs.tests.protobuf.protobuf_test
#!/usr/bin/env python3
import time
from . import variables_pb2
from .sample_logger import SampleLogger
# from . import asizeof
[docs]class ProtobufTest(object):
def __init__(self, samp_num=100000, channels_num=25, log_interval=100):
print("Samples: ", samp_num, " channels: ", channels_num,
" log_interval: ", log_interval)
self.num_of_samples = samp_num
self.log_interval = log_interval
self.num_of_channels = channels_num
self.logger = SampleLogger(self.log_interval)
self.sample_vec = variables_pb2.SampleVector()
for x in range(1): # self.num_of_channels):
samp = self.sample_vec.samples.add()
for i in range(self.num_of_channels):
samp.channels.append(float(x))
samp.timestamp = time.time()
self.msg = self.sample_vec.SerializeToString()
print("Approx. serialized sample vector size: ", len(self.msg))
[docs] def perform_packing_test(self):
start_time = time.time()
print("Start packing test: ")
self.logger.mark_start()
for i in range(self.num_of_samples):
samp = self.sample_vec.samples[0]
# don`t do sth like: samp.channels[x] = float(x) without
# clearing samp. Somehow, not-clearing samp results in linear memory usage...
samp.Clear()
for x in range(self.num_of_channels):
samp.channels.append(float(x))
samp.timestamp = time.time()
self.sample_vec.SerializeToString() # TODO: check if returned value is ok
# self.logger.log_sample()
self.logger.mark_end()
end_time = time.time()
print("End of packing test - time: ", end_time - start_time,
" approx. sample rate: ", float(self.num_of_samples) / (end_time - start_time))
data_size = len(self.msg) * self.num_of_samples
print(float(data_size) / 1024 / 1024, " MiB")
print(float(data_size) / (end_time - start_time) / 1000 / 1000 * 8, " Mbps")
# self.logger.report()
[docs] def perform_unpacking_test(self):
start_time = time.time()
test_vec = variables_pb2.SampleVector()
msg = self.sample_vec.SerializeToString()
print("Start deserializing test: ")
self.logger.mark_start()
for i in range(self.num_of_samples):
test_vec.ParseFromString(msg)
# self.logger.log_sample()
self.logger.mark_end()
end_time = time.time()
print("End of unpacking test - time: ", end_time - start_time,
" approx. sample rate: ", float(self.num_of_samples) / (end_time - start_time))
# self.logger.report()
data_size = len(self.msg) * self.num_of_samples
print(float(data_size) / 1024 / 1024, " MiB")
print(float(data_size) / (end_time - start_time) / 1000 / 1000 * 8, " Mbps")
[docs]def test_protobuf_test():
samp_num = 100
chan_num = 25
log_interval = 10
pt = ProtobufTest(samp_num=samp_num,
channels_num=chan_num,
log_interval=log_interval)
pt.perform_packing_test()
pt.perform_unpacking_test()
if __name__ == "__main__":
import sys
# samp_num = 100
# chan_num = 25
# log_interval = 10
if len(sys.argv) != 4:
print("Usage: ./protobuf_test <num samples> <num channels> <log_interval>")
sys.exit(0)
samp_num = int(sys.argv[1])
chan_num = int(sys.argv[2])
log_interval = int(sys.argv[3])
pt = ProtobufTest(samp_num=samp_num,
channels_num=chan_num,
log_interval=log_interval)
pt.perform_packing_test()
pt.perform_unpacking_test()