Thread in den Arbeitsspeicher schreiben: kein Plan wie man sowas anfängt (8 answers)
Opened by Froschpopo at 2004-03-14 20:33

ptk
 2004-03-15 17:02
#81003 #81003
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ist open(2) auf modernen Unices tatsaechlich so viel schlechter? Hier ist ein Beispiel-Benchmark fuer das Lesen aus einer Datei und aus einem Shared-Memory-Bereich mittels IPC::ShareLite:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use Benchmark qw(cmpthese);
use IPC::ShareLite;

{
my $share = new IPC::ShareLite( -key => 1971,
-create => 'yes',
-destroy => 'no' ) or die $!;
open(my $bla, $0) or die $!;
$share->store(join "", <$bla>);
}

cmpthese(-1,
{fs => sub {
open(my $bla, $0) or die $!;
local $/ = undef;
my $buf = <$bla>;
#warn $buf
},
ipc => sub {
my $share = new IPC::ShareLite( -key => 1971,
-create => 'no',
-destroy => 'no' ) or die $!;
$share->fetch;
}
},
);

Und das Ergebnis:
Code: (dl )
1
2
3
4
5
6
Benchmark: running fs, ipc for at least 1 CPU seconds...
fs: 1 wallclock secs ( 0.76 usr + 0.26 sys = 1.02 CPU) @ 44383.33/s (n=45271)
ipc: 2 wallclock secs ( 0.91 usr + 0.13 sys = 1.04 CPU) @ 11486.54/s (n=11946)
Rate ipc fs
ipc 11487/s -- -74%
fs 44383/s 286% --

Das Ergebnis aendert sich signifikant zugunsten von Shared-Memory, wenn das ShareLite-Objekt nur einmal erzeugt wird (aber vielleicht wuerde ein offen gehaltenes Filehandle und ein seek() an den Anfang wieder die open()-Variante nach vorne bringen). Natuerlich gibt es weitere Parameter wie die Groesse des auszutauschenden Buffers, Locking muss vielleicht noch eingefuehrt werden etc.

View full thread in den Arbeitsspeicher schreiben: kein Plan wie man sowas anfängt