Hi Serge and all, Serge Hulne wrote:
Actually, what I do not grasp is the following: - Vala is allegedly just a thin object-oriented layer on top of C (glib2). - One might therefore expect a runtime performance which is closer to say C or C++, than to the (slower) performance of a high-level language (like , e.g.Python). - However, it turns out that, surprisingly Vala is not only slower than C and C++ but even slower than Python. This is the part that I do not understand !
I've just seen that somebody already did the same, but I too tried to
optimize your wordcount implementation a bit and got to the following Vala
program:
---
namespace WordCount {
private int count_spaces(string str) {
int result = 0;
for (int i = 1; i < str.length; i++) {
if (str[i] == ' ') {
result++;
}
}
return result;
}
public int main(string[] args) {
File file;
DataInputStream dis;
string line;
int wc, lc;
for (int i = 1; i < args.length; i++) {
file = File.new_for_path(args[i]);
try {
dis = new DataInputStream(file.read());
wc = 0;
lc = 0;
while ((line = dis.read_line(null)) != null) {
lc++;
wc += count_spaces(line);
}
stdout.printf("lc = %d. wc = %d\n", lc, wc);
} catch (Error e) {
stderr.printf("Error processing file '" + file.get_path()
+ "': " + e.message);
}
}
return 0;
}
}
---
Note that "valac --pkg gio-2.0 wc2.vala" is necessary to compile my version,
since it uses the Gio package. Compiling your own program as wc1 and my
variant as wc2, I get the following results (when run on the file
http://www.math.jhu.edu/~jkramer/shakespeare/shaks12.txt ):
$ time /usr/bin/wc ../shakespeare.txt
124456 901325 5582655 ../shakespeare.txt
real 0m0.258s
user 0m0.248s
sys 0m0.004s
$ time wc1
lc = 124457. wc = 1418390
real 0m0.874s
user 0m0.860s
sys 0m0.008s
$ time wc2 ../shakespeare.txt
lc = 124456. wc = 1184092
real 0m0.278s
user 0m0.260s
sys 0m0.012s
So there really is no speed penality for coding in Vala as compared to C.
Some noteworthy points:
1. My implementation is still quite readable standard Vala code. No need to
revert to dirty tricks.
2. Even your own version was only 3 times slower than the C version, not 10
times. Maybe you're using an old version of the Vala compiler? (I used 0.12.0)
3. The most important changes in my experiment where:
a. Switching from FileStream to Gio's DataInputStream. That brought the time
down to 0.559s.
b. Switching from line.split(" ") (which creates lots of unnecessary
objects) to my count_spaces method. That brought it further down to the
0.278s noted above.
Best regards
Christian
--
|------- Dr. Christian Siefkes ------- christian siefkes net -------
| Homepage: http://www.siefkes.net/ | Blog: http://www.keimform.de/
| Peer Production Everywhere: http://peerconomy.org/wiki/
|---------------------------------- OpenPGP Key ID: 0x346452D8 --
Everyone by now presumably knows about the danger of premature optimization.
I think we should be just as worried about premature design -- deciding too
early what a program should do.
-- Paul Graham, Hackers and Painters
Attachment:
signature.asc
Description: OpenPGP digital signature