/**
\file timer.cpp
\author michael.zohner@ec-spride.de
\copyright ABY - A Framework for Efficient Mixed-protocol Secure Two-party Computation
Copyright (C) 2019 ENCRYPTO Group, TU Darmstadt
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ABY is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
\brief timer Implementation
*/
#include
#include
#include
#include
#include
#include "timer.h"
#include "constants.h"
#include "socket.h"
#include "typedefs.h"
aby_timings m_tTimes[P_LAST - P_FIRST + 1];
aby_comm m_tSend[P_LAST - P_FIRST + 1];
aby_comm m_tRecv[P_LAST - P_FIRST + 1];
double getMillies(timespec timestart, timespec timeend) {
long time1 = (timestart.tv_sec * 1000000) + (timestart.tv_nsec / 1000);
long time2 = (timeend.tv_sec * 1000000) + (timeend.tv_nsec / 1000);
return (double) (time2 - time1) / 1000;
}
void StartWatch(const std::string& msg, ABYPHASE phase) {
if (phase < P_FIRST || phase > P_LAST) {
std::cerr << "Phase not recognized: " << phase << std::endl;
return;
}
clock_gettime(CLOCK_MONOTONIC, &(m_tTimes[phase].tbegin));
#ifndef BATCH
std::cout << msg << std::endl;
#else
(void)msg; // silence -Wunused-parameter warning
#endif
}
void StopWatch(const std::string& msg, ABYPHASE phase) {
if (phase < P_FIRST || phase > P_LAST) {
std::cerr << "Phase not recognized: " << phase << std::endl;
return;
}
clock_gettime(CLOCK_MONOTONIC, &(m_tTimes[phase].tend));
m_tTimes[phase].timing = getMillies(m_tTimes[phase].tbegin, m_tTimes[phase].tend);
#ifndef BATCH
std::cout << msg << m_tTimes[phase].timing << " ms " << std::endl;
#else
(void)msg; // silence -Wunused-parameter warning
#endif
}
void StartRecording(const std::string& msg, ABYPHASE phase,
const std::vector>& sock) {
StartWatch(msg, phase);
m_tSend[phase].cbegin = 0;
m_tRecv[phase].cbegin = 0;
for(uint32_t i = 0; i < sock.size(); i++) {
m_tSend[phase].cbegin += sock[i]->getSndCnt();
m_tRecv[phase].cbegin += sock[i]->getRcvCnt();
}
}
void StopRecording(const std::string& msg, ABYPHASE phase,
const std::vector>& sock) {
StopWatch(msg, phase);
m_tSend[phase].cend = 0;
m_tRecv[phase].cend = 0;
for(uint32_t i = 0; i < sock.size(); i++) {
m_tSend[phase].cend += sock[i]->getSndCnt();
m_tRecv[phase].cend += sock[i]->getRcvCnt();
}
m_tSend[phase].totalcomm = m_tSend[phase].cend - m_tSend[phase].cbegin;
m_tRecv[phase].totalcomm = m_tRecv[phase].cend - m_tRecv[phase].cbegin;
}
void PrintTimings() {
std::string unit = " ms";
std::cout << "Timings: " << std::endl;
std::cout << "Total =\t\t" << m_tTimes[P_TOTAL].timing << unit << std::endl;
std::cout << "Init =\t\t" << m_tTimes[P_INIT].timing << unit << std::endl;
std::cout << "CircuitGen =\t" << m_tTimes[P_CIRCUIT].timing << unit << std::endl;
std::cout << "Network =\t" << m_tTimes[P_NETWORK].timing << unit << std::endl;
std::cout << "BaseOTs =\t" << m_tTimes[P_BASE_OT].timing << unit << std::endl;
std::cout << "Setup =\t\t" << m_tTimes[P_SETUP].timing << unit << std::endl;
std::cout << "OTExtension =\t" << m_tTimes[P_OT_EXT].timing << unit << std::endl;
std::cout << "Garbling =\t" << m_tTimes[P_GARBLE].timing << unit << std::endl;
std::cout << "Online =\t" << m_tTimes[P_ONLINE].timing << unit << std::endl;
}
void PrintCommunication() {
std::string unit = " bytes";
std::cout << "Communication: " << std::endl;
std::cout << "Total Sent / Rcv\t" << m_tSend[P_TOTAL].totalcomm << " " << unit << " / " << m_tRecv[P_TOTAL].totalcomm << unit << std::endl;
std::cout << "BaseOTs Sent / Rcv\t" << m_tSend[P_BASE_OT].totalcomm << " " << unit << " / " << m_tRecv[P_BASE_OT].totalcomm << unit << std::endl;
std::cout << "Setup Sent / Rcv\t" << m_tSend[P_SETUP].totalcomm << " " << unit << " / " << m_tRecv[P_SETUP].totalcomm << unit << std::endl;
std::cout << "OTExtension Sent / Rcv\t" << m_tSend[P_OT_EXT].totalcomm << " " << unit << " / " << m_tRecv[P_OT_EXT].totalcomm << unit << std::endl;
std::cout << "Garbling Sent / Rcv\t" << m_tSend[P_GARBLE].totalcomm << " " << unit << " / " << m_tRecv[P_GARBLE].totalcomm << unit << std::endl;
std::cout << "Online Sent / Rcv\t" << m_tSend[P_ONLINE].totalcomm << " " << unit << " / " << m_tRecv[P_ONLINE].totalcomm << unit << std::endl;
}