最近,我们有一个要求,即有超过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++版本并没有比C#版本快得多。在两个版本中都运行了sevaral times。事实上,在一些运行期间,它和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";
}
为什么你会期望它们有所不同? – 2013-02-20 05:43:02
你是如何编译C++代码的? – jogojapan 2013-02-20 05:43:19
@jogojapan,发布版本。 – Jagannath 2013-02-20 05:46:33