最近,我們有一個要求,即有超過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