#!tree
# This file builds binary search trees in Perl and C
# It can be used to compare the performance of
# C, Perl, associative arrays etc...
#
$tree_head = &new_node("", "head");
$tree_z = &new_node("__end__", "");
&set_right($tree_head,$tree_z);
&set_left($tree_z,$tree_z);
&set_right($tree_z,$tree_z);
# Insert an item into the tree
sub insert_tree_perl {
local($key,$value) = @_;
$p= $tree_head;
$x= &get_right($tree_head);
while ($x ne $tree_z) {
$p=$x;
if ($key lt &get_key($x)) {
$x = &get_left($x);
} else {
$x = &get_right($x);
}
}
$x = &new_node($key,$value);
if ($key lt &get_key($p)) {
&set_left($p,$x);
} else {
&set_right($p,$x);
}
&set_left($x, $tree_z);
&set_right($x, $tree_z);
$tree_size = $tree_size+1;
}
sub search_tree_perl {
local($key) = @_;
$found = $key;
$x = &get_right($tree_head);
while ($x ne $tree_z) {
if (&get_key($x) eq $key) {
$found = &get_value($x);
return;
} else {
if ($key lt &get_key($x)) {
$x = &get_left($x);
}{
$x = &get_right($x);
}
}
}
$key;
}
# Build tree structure in C (for the most part)
sub build_data {
local($nitems) = @_;
for ($i = 0; $i < $nitems; $i++) {
$r = &rand();
&insert_tree("_$r", "_$r", $tree_head, $tree_z);
# set data(_$r) _$r
}
}
# Build tree structure in Perl
sub build_data_perl {
local($nitems) = @_;
for ($i = 0; $i < $nitems; $i++) {
$r = &rand();
&insert_tree_perl("_$r","_$r");
# set data(_$r) _$r
}
}
# Now do a bunch of lookups,
print "Building a binary search tree...\n";
print "Inserting 10000 items using Perl...\n";
&timer_clear(0);
&timer_start(0);
&build_data_perl(10000);
&timer_stop(0);
print &timer_elapsed(0), " seconds.\n";
print "Inserting 10000 items using Perl and C...\n";
&timer_clear(1);
&timer_start(1);
&build_data(10000);
&timer_stop(1);
print &timer_elapsed(1)," seconds.\n";
print "Speedup = ", &timer_elapsed(0)/&timer_elapsed(1), "\n";
$nlookup = 20000;
print "Doing $nlookup lookups on trees (in Perl)\n";
&timer_clear(0);
&timer_start(0);
for ($i = 0; $i < $nlookup; $i++) {
$r=&rand();
$g=&search_tree_perl("_$r");
}
&timer_stop(0);
print &timer_elapsed(0), " seconds.\n";
print "Doing $nlookup lookups on trees (in Perl and C)\n";
&timer_clear(1);
&timer_start(1);
for ($i = 0; $i < $nlookup; $i++) {
$r = &rand();
$g = &search_tree("_$r",$tree_head,$tree_z);
}
&timer_stop(1);
print &timer_elapsed(1)," seconds.\n";
print "Speedup = ", &timer_elapsed(0)/&timer_elapsed(1),"\n";
syntax highlighted by Code2HTML, v. 0.9.1