これに対する答えは 1 つではありません。使用するコンパイラや標準ライブラリによって結果が異なる可能性があるためです。たとえば、小さなテスト/タイミング ハーネスを使用して、さまざまな試みを 1 つのプログラムにまとめました。次に、楽しみのために、4 回目の試行 (以下のコードの test3) を追加しました。
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <time.h>
#include <fstream>
#include <sstream>
#include <string.h>
static const int limit = 1000000;
void test1() {
std::ofstream test("test.xml");
for (int i = 0; i < limit; i++)
{
test << "<p> attr1=\"test1\" attr2=\"test2\" attr3=\"test3\" attr4=\"test4\">test5</p>\n";
}
test.close();
}
void test11() {
std::ofstream test("test.xml");
std::string fileDataStr;
for (int i = 0; i < limit; i++)
{
fileDataStr += "<p> attr1=\"test1\" attr2=\"test2\" attr3=\"test3\" attr4=\"test4\">test5</p>\n";
}
test << fileDataStr;
test.close();
}
void test2() {
std::ofstream test("test.xml");
std::stringstream fileDataStr;
for (int i = 0; i < limit; i++)
{
fileDataStr << "<p> attr1=\"test1\" attr2=\"test2\" attr3=\"test3\" attr4=\"test4\">test5</p>\n";
}
test << fileDataStr.str();
test.close();
}
void test3() {
std::ofstream test("test.xml");
std::vector<char> buffer;
char line [] = "<p> attr1=\"test1\" attr2=\"test2\" attr3=\"test3\" attr4=\"test4\">test5</p>\n";
size_t len = strlen(line);
buffer.reserve(limit * len + 1);
for (int i = 0; i < limit; i++)
std::copy(line, line + len, std::back_inserter(buffer));
test.write(&buffer[0], buffer.size());
test.close();
}
template <class T>
void timer(T f) {
clock_t start = clock();
f();
clock_t stop = clock();
std::cout << double(stop - start) / CLOCKS_PER_SEC << " seconds\n";
}
int main() {
timer(test1);
timer(test11);
timer(test2);
timer(test3);
}
次に、VC++ でコンパイルしたところ、次の結果が得られました。
0.681 seconds
0.659 seconds
0.874 seconds
0.955 seconds
次に、g++ でコンパイルしたところ、次の結果が得られました。
1.267 seconds
0.725 seconds
0.795 seconds
0.649 seconds
4 番目のバージョン (私が追加したもの) では、VC++ で最悪のパフォーマンスが得られますが、g++ で最高のパフォーマンスが得られます。VC++ で 2 番目に高速だったものは、(はるかに) g++ で最も低速です。
Xが真である理由を尋ねています。残念ながら、X は常に真であるとは限りません。
本当に意味のある答えを出すには、あなたが使用していた正確なコンパイラと標準ライブラリのかなり詳細な分析を行う必要があるでしょう。