Я показываю вам код на C # и C ++, которые выполняют одно и то же задание: прочитать один и тот же текстовый файл, разделенный символом «|», и сохранить текст с разделителем «#».
Когда я выполняю программу на C ++, время составляет 169 секунд.
ОБНОВЛЕНИЕ 1: Благодаря Сету (компиляция с: cl / EHsc / Ox / Ob2 / Oi) и GWW для изменения положений строки s вне петель истекшее время было сокращено до 53 секунд. Я также обновил код.
ОБНОВЛЕНИЕ 2: Есть ли у вас другие предложения по улучшению кода C ++?
Когда я выполняю программу на C #, истекшее время составляет 34 секунды!
Вопрос в том, как повысить скорость C ++ по сравнению с C # one?
C ++ Программа:
int main ()
{
Timer t;
cout << t.ShowStart() << endl;
ifstream input("in.txt");
ofstream output("out.txt", ios::out);
char const row_delim = '\n';
char const field_delim = '|';
string s1, s2;
while (input)
{
if (!getline( input, s1, row_delim ))
break;
istringstream iss(s1);
while (iss)
{
if (!getline(iss, s2, field_delim ))
break;
output << s2 << "#";
}
output << "\n";
}
t.Stop();
cout << t.ShowEnd() << endl;
cout << "Executed in: " << t.ElapsedSeconds() << " seconds." << endl;
return 0;
}
C # программа:
static void Main(string[] args)
{
long i;
Stopwatch sw = new Stopwatch();
Console.WriteLine(DateTime.Now);
sw.Start();
StreamReader sr = new StreamReader("in.txt", Encoding.Default);
StreamWriter wr = new StreamWriter("out.txt", false, Encoding.Default);
object[] cols = new object[0]; // allocates more elements automatically when filling
string line;
while (!string.Equals(line = sr.ReadLine(), null)) // Fastest way
{
cols = line.Split('|'); // Faster than using a List<>
foreach (object col in cols)
wr.Write(col + "#");
wr.WriteLine();
}
sw.Stop();
Console.WriteLine("Conteo tomó {0} secs", sw.Elapsed);
Console.WriteLine(DateTime.Now);
}
ОБНОВЛЕНИЕ 3:
Ну, я должен сказать, что я очень рад за полученную помощь и потому что ответ на мой вопрос был удовлетворен.
Я немного изменил текст вопроса, чтобы он стал более конкретным, и я проверил решения, которые любезно вызвали Молбдлино и Бо Перссона.
Сохранение указаний Seth для команды компиляции (т.е. cl / EHsc / Ox / Ob2 / Oi pgm.cpp):
Решению Бо Перссона в среднем потребовалось 18 секунд, чтобы завершить выполнение, действительно хорошее, учитывая, что код близок к тому, что мне нравится).
Решение Molbdlino заняло в среднем 6 секунд, действительно потрясающе !! (также благодаря Константину).
Никогда не поздно учиться, и я усвоил ценные вещи со своим вопросом.
Мои наилучшие пожелания.