Re: Java vs C++ speed (IO & Sorting)
On Mar 20, 1:10 am, Razii <fdgl...@hotmails.com> wrote:
This topic was on these newsgroups 7 years ago :)
http://groups.google.com/group/comp.lang.c++/msg/695ebf877e25b287
I said then: "How about reading the whole Bible, sorting by lines, and
writing the sorted book to a file?"
Who remember that from 7 years ago, one of the longest thread on this
newsgroup :)
The text file used for the bible is hereftp://ftp.cs.princeton.edu/pub/cs126/markov/textfiles/bible.txt
Back to see if anything has changed
(downloaded whatever is latest version from sun.java.com)
Time for reading, sorting, writing: 359 ms (Java)
Time for reading, sorting, writing: 375 ms (Java)
Time for reading, sorting, writing: 375 ms (Java)
Visual C++ express and command I used was cl IOSort.cpp /O2
Time for reading, sorting, writing: 375 ms (c++)
Time for reading, sorting, writing: 390 ms (c++)
Time for reading, sorting, writing: 359 ms (c++)
The question still is (7 years later), where is great speed advantage
you guys were claiming for c++?
------------------- Java Code -------------- (same as 7 years ago :)
import java.io.*;
import java.util.*;
public class IOSort
{
public static void main(String[] arg) throws Exception
{
ArrayList ar = new ArrayList(5000);
String line = "";
BufferedReader in = new BufferedReader(
new FileReader("bible.txt"));
PrintWriter out = new PrintWriter(new BufferedWriter(
new FileWriter("output.txt")));
long start = System.currentTimeMillis();
while (true)
{
line = in.readLine();
if (line == null)
break;
if (line.length() == 0)
continue;
ar.add(line);
}
Collections.sort(ar);
int size = ar.size();
for (int i = 0; i < size; i++)
{
out.println(ar.get(i));
}
out.close();
long end = System.currentTimeMillis();
System.out.println("Time for reading, sorting, writing: "+
(end - start) + " ms");
}
}
--------- C++ Code ---------------
#include <fstream>
#include<iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace ::std;
int main()
{
vector<string> buf;
string linBuf;
ifstream inFile("bible.txt");
clock_t start=clock();
buf.reserve(50000);
while(getline(inFile,linBuf)) buf.insert(buf.end(), linBuf);
sort(buf.begin(), buf.end());
ofstream outFile("output.txt");
copy(buf.begin(),buf.end(),ostream_iterator<string>(outFile,"\n"));
clock_t endt=clock();
cout <<"Time for reading, sorting, writing: " << endt-start << "
ms\n";
return 0;
}
I like how you start the time _after_ allocations and initializations
for Java, but _before_ them in C++.
Also, clock has granularity has big as my toe. I've seen it skew as
much as a second on some machines. There are several pages on Google
on how to do _REAL_ performance time measurements. It gets even worse
on multi-core systems.
To be completely fair, I'd start a performance timer, start another
process to do the work, let the process exit, stop the timer. I'd also
limit both to a single core, and use a timer that has a guaranteed
granularity of 1 ms. Only then could you say ,"Java parsed and sorted
this particular example faster than C++" and that would be all you
could say.
I'm not trying to say one language performs better than the other.
Frankly, I don't care. But your experiment defies several laws of
scientific testing.