/**
\file timer.h
\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
*/
#ifndef __TIMER_H__
#define __TIMER_H__
#include
#include
#include
#include
class CSocket;
//Note do not change P_FIRST and P_LAST and keep them pointing to the first and last element in the enum
enum ABYPHASE {
P_TOTAL, P_INIT, P_CIRCUIT, P_NETWORK, P_BASE_OT, P_SETUP, P_OT_EXT, P_GARBLE, P_ONLINE, P_FIRST = P_TOTAL, P_LAST = P_ONLINE
};
// Structure for measuring runtime
struct aby_timings {
double timing;
timespec tbegin;
timespec tend;
};
// Structure for counting communication
struct aby_comm {
uint64_t totalcomm;
uint64_t cbegin;
uint64_t cend;
};
extern aby_timings m_tTimes[P_LAST - P_FIRST + 1];
extern aby_comm m_tSend[P_LAST - P_FIRST + 1];
extern aby_comm m_tRecv[P_LAST - P_FIRST + 1];
/**
* Return time difference in milliseconds
*/
double getMillies(timespec timestart, timespec timeend);
/**
* Start measuring runtime for a given phase
* @param msg - a message for debugging
* @param phase - the ABY phase to measure
*/
void StartWatch(const std::string& msg, ABYPHASE phase);
/**
* Stop measuring runtime
* Called after StartWatch() with identical phase parameter
* @param msg - a message for debugging
* @param phase - the ABY phase to measure
*/
void StopWatch(const std::string& msg, ABYPHASE phase);
/**
* Start measuring both runtime and communication
* @param msg - a message for debugging
* @param phase - the ABY phase to measure
* @param sock - a vector of sockets
*/
void StartRecording(const std::string& msg, ABYPHASE phase,
const std::vector>& sock);
/**
* Stop measuring both runtime and communication
* Called after StartRecording() with identical phase parameter
* @param msg - a message for debugging
* @param phase - the ABY phase to measure
* @param sock - a vector of sockets
*/
void StopRecording(const std::string& msg, ABYPHASE phase,
const std::vector>& sock);
void PrintTimings();
void PrintCommunication();
inline double GetTimeForPhase(ABYPHASE phase) {
return m_tTimes[phase].timing;
}
inline uint64_t GetSentDataForPhase(ABYPHASE phase) {
return m_tSend[phase].totalcomm;
}
inline uint64_t GetReceivedDataForPhase(ABYPHASE phase) {
return m_tRecv[phase].totalcomm;
}
#endif /* TIMER_H_ */