В последнее время у нас было требование, когда есть более 100 000 xml-файлов, и все они нуждались в модификации конкретных данных в xml. Простая команда perl выполнила бы задание, но perl не был установлен на машине, где находятся файлы. Поэтому я написал небольшой код C#, чтобы выполнить эту работу.почему этот код на C++ медленнее по сравнению с вариантом C#
private static void ModifyXML(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
string path = @args[0];
string opath = @args[1];
string token = "value_date=\"20121130\"";
string target = "value_date=\"20121019\"";
Parallel.ForEach(Directory.EnumerateFiles(path), (file) =>
{
StringBuilder sb = new StringBuilder(File.ReadAllText(file));
sb.Remove(0, 55);
sb.Replace(token, target);
var filename = file.Split(new char[] { '\\' }).Last();
File.WriteAllText(string.Format("{0}\\{1}", opath, filename), sb.ToString());
});
TimeSpan ts = sw.Elapsed;
Console.WriteLine("Took {0} secs", ts.TotalSeconds);
}
Я решил реализовать версию на С ++. Оказалось, что версия C++ не была значительно быстрее, чем версия C#. В run обе версии sevaral times.In факт, это так же быстро, как и версия C# во время некоторых запусков.
Для C# я использовал .NET 4.0 и для C++ это VC10.
void FileHandling(std::string src, std::string dest)
{
namespace fs = boost::filesystem;
auto start = boost::chrono::system_clock::now();
string token = "value_date=\"20121130\"";
string target = "value_date=\"20121019\"";
fs::directory_iterator end_iter;
fs::directory_iterator dir_itr(src);
vector<fs::path> files;
files.insert(files.end(), dir_itr, end_iter);
string dest_path = dest + "\\";
parallel_for_each(files.begin(), files.end(), [=](const fs::path& filepath)
{
ifstream inpfile (filepath.generic_string());
string line;
line.insert(line.end(), istreambuf_iterator<char>(inpfile), istreambuf_iterator<char>());
line.erase(0, 55);
auto index = line.find(token, 0);
if (index != string::npos)
{
line.replace(index, token.size(), target);
}
ofstream outfile(dest_path + filepath.filename().generic_string());
outfile << line;
});
boost::chrono::duration<double> finish = boost::chrono::system_clock::now() - start;
std::cout << "Took " << finish.count() << " secs\n";
}
Почему вы ожидаете, что они будут отличаться? –
Как вы скомпилировали код на C++? – jogojapan
@jogojapan, Release build. – Jagannath