mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-24 02:57:11 +08:00
Add support for saving timing file during benchmark
Add a new argument to bench to specify the name of the file where timing information will be saved for each benchmark session. This argument is optional, if not specified file will not be created. Original patch by Heinz van Saanen Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
@@ -72,7 +72,7 @@ void benchmark(const string& commandLine) {
|
|||||||
|
|
||||||
istringstream csVal(commandLine);
|
istringstream csVal(commandLine);
|
||||||
istringstream csStr(commandLine);
|
istringstream csStr(commandLine);
|
||||||
string ttSize, threads, fileName, limitType;
|
string ttSize, threads, fileName, limitType, timFile;
|
||||||
int val, secsPerPos, maxDepth, maxNodes;
|
int val, secsPerPos, maxDepth, maxNodes;
|
||||||
|
|
||||||
csStr >> ttSize;
|
csStr >> ttSize;
|
||||||
@@ -98,6 +98,7 @@ void benchmark(const string& commandLine) {
|
|||||||
csVal >> val;
|
csVal >> val;
|
||||||
csVal >> fileName;
|
csVal >> fileName;
|
||||||
csVal >> limitType;
|
csVal >> limitType;
|
||||||
|
csVal >> timFile;
|
||||||
|
|
||||||
secsPerPos = maxDepth = maxNodes = 0;
|
secsPerPos = maxDepth = maxNodes = 0;
|
||||||
|
|
||||||
@@ -130,30 +131,49 @@ void benchmark(const string& commandLine) {
|
|||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
positions.push_back(string(BenchmarkPositions[i]));
|
positions.push_back(string(BenchmarkPositions[i]));
|
||||||
|
|
||||||
int startTime = get_system_time();
|
ofstream timingFile;
|
||||||
|
if (!timFile.empty())
|
||||||
|
{
|
||||||
|
timingFile.open(timFile.c_str(), ios::out | ios::app);
|
||||||
|
if (!timingFile.is_open())
|
||||||
|
{
|
||||||
|
cerr << "Unable to open timing file " << timFile << endl;
|
||||||
|
Application::exit_with_failure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
vector<string>::iterator it;
|
vector<string>::iterator it;
|
||||||
int cnt = 1;
|
int cnt = 1;
|
||||||
int64_t totalNodes = 0;
|
int64_t totalNodes = 0;
|
||||||
|
int startTime = get_system_time();
|
||||||
|
|
||||||
for (it = positions.begin(); it != positions.end(); ++it, ++cnt)
|
for (it = positions.begin(); it != positions.end(); ++it, ++cnt)
|
||||||
{
|
{
|
||||||
Move moves[1] = {MOVE_NONE};
|
Move moves[1] = {MOVE_NONE};
|
||||||
int dummy[2] = {0, 0};
|
int dummy[2] = {0, 0};
|
||||||
Position pos(*it);
|
Position pos(*it);
|
||||||
cout << "\nProcessing position " << cnt << '/' << positions.size() << endl << endl;
|
cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl;
|
||||||
if (!think(pos, true, false, 0, dummy, dummy, 0, maxDepth, maxNodes, secsPerPos, moves))
|
if (!think(pos, true, false, 0, dummy, dummy, 0, maxDepth, maxNodes, secsPerPos, moves))
|
||||||
break;
|
break;
|
||||||
totalNodes += nodes_searched();
|
totalNodes += nodes_searched();
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt = get_system_time() - startTime;
|
cnt = get_system_time() - startTime;
|
||||||
cout << "\nProcessing time (ms) " << cnt
|
cerr << "==============================="
|
||||||
<< "\nNodes searched " << totalNodes
|
<< "\nTotal time (ms) : " << cnt
|
||||||
<< "\nNodes/second " << (int)(totalNodes/(cnt/1000.0))
|
<< "\nNodes searched : " << totalNodes
|
||||||
<< endl;
|
<< "\nNodes/second : " << (int)(totalNodes/(cnt/1000.0)) << endl << endl;
|
||||||
|
|
||||||
|
if (!timFile.empty())
|
||||||
|
{
|
||||||
|
timingFile << cnt << endl << endl;
|
||||||
|
timingFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
// Under MS Visual C++ debug window always unconditionally closes
|
// Under MS Visual C++ debug window always unconditionally closes
|
||||||
// when program exits, this is bad because we want to read results before.
|
// when program exits, this is bad because we want to read results before.
|
||||||
#if (defined(WINDOWS) || defined(WIN32) || defined(WIN64))
|
#if (defined(WINDOWS) || defined(WIN32) || defined(WIN64))
|
||||||
cout << "Press any key to exit" << endl;
|
cerr << "Press any key to exit" << endl;
|
||||||
cin >> fileName;
|
cin >> fileName;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,16 +60,18 @@ int main(int argc, char *argv[]) {
|
|||||||
// Process command line arguments if any
|
// Process command line arguments if any
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
{
|
{
|
||||||
if (string(argv[1]) != "bench" || argc < 4 || argc > 7)
|
if (string(argv[1]) != "bench" || argc < 4 || argc > 8)
|
||||||
cout << "Usage: stockfish bench <hash size> <threads> "
|
cout << "Usage: stockfish bench <hash size> <threads> "
|
||||||
<< "[time = 60s] [fen positions file = default] "
|
<< "[time = 60s] [fen positions file = default] "
|
||||||
<< "[time, depth or node limited = time]" << endl;
|
<< "[time, depth or node limited = time] "
|
||||||
|
<< "[timing file name = none]" << endl;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string time = argc > 4 ? argv[4] : "60";
|
string time = argc > 4 ? argv[4] : "60";
|
||||||
string fen = argc > 5 ? argv[5] : "default";
|
string fen = argc > 5 ? argv[5] : "default";
|
||||||
string lim = argc > 6 ? argv[6] : "time";
|
string lim = argc > 6 ? argv[6] : "time";
|
||||||
benchmark(string(argv[2]) + " " + string(argv[3]) + " " + time + " " + fen + " " + lim);
|
string tim = argc > 7 ? argv[7] : "";
|
||||||
|
benchmark(string(argv[2]) + " " + string(argv[3]) + " " + time + " " + fen + " " + lim + " " + tim);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user