Re: PERL, bytecsere

2007-05-22 bef zés Kiss Gabor

In article <[EMAIL PROTECTED]>,
Molnár István <[EMAIL PROTECTED]> writes:
> $blob = reverse -$blob;

Ez mit is csinal szerinted? :-o

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Molnár István
Kiss Gabor wrote:
>
> # 0.01 s de fejreall a kep :-)
>$blob = reverse $blob;
>
>   

$blob = reverse -$blob;

vagy méggyorsabban:

= - reverse ;
# ez csak emlék egy hasonló célú progiból, nem vagyok teljesen biztos 
benne és kipróbálni nem tudom
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Kiss Gabor

In article <[EMAIL PROTECTED]>,
[EMAIL PROTECTED] (Kiss Gabor) writes:

> # 0.01 s de fejreall a kep :-)
>$blob = reverse $blob;

Vegul ennel maradtam, es 20 ms alatt pedig visszaforgatom a kesz kepet.

Kosz mindenkinek!

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Kiss Gabor

Meresi hiba volt. Ujra:

# 1.5 s
   $blob=~ s/(.)(.)(.)/$3$2$1/g;   # R<->B swap

# 0.01 s de fejreall a kep :-)
   $blob = reverse $blob;

# 1.2 s
   $blob = pack( '(C)*', unpack( '(xxCXXCXXCxx)*', $blob ) );

# 1.1 s
   $blob = pack( '(C)*', unpack( '(@2C @1C @0C xx)*', $blob ) );

# 0.5 s
   $blob = reverse pack('(a3)*', reverse unpack('(a3)*', $blob));

# 1.7 s
my @tomb = unpack('C*', $blob);
for (my $i=0; $i<=$#tomb; $i+=3 )
{
my $x = $tomb[$i];
$tomb[$i]  = $tomb[$i+2];
$tomb[$i+2] = $x;
}
$blob = pack('C*', @tomb);

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Attila Szabo
2007, May 21 -> Kiss Gabor wrote :
> $blob = reverse pack('(a3)*', reverse unpack('(a3)*', $blob));

hello,
erdekes h nalad gyorsabb a regexp-es megoldas,
en is vmi pack-es dologra gondolnek inkabb, ez igy tenyleg eleg gyors:

undef $/;
reverse pack('(i3)*', unpack('(i3)*', <>)); 

egy core duo macbook-on 0.6 sec, a regexp meg 2 sec...
30x futtattam mindkettot...

Atti

_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Pirity Tamas Gabor
Ha jól hiszem, Kiss Gabor írta az alábbiakat:
> 
> In article <[EMAIL PROTECTED]>,
>   Pirity Tamas Gabor <[EMAIL PROTECTED]> writes:
> > Mennyi p=E9nzed van gyorsabb hardverre?
> 
> 1179738718 masodperc. :-(

Illetve a másik ötlet, hogy írd meg C-ben.

-- 
PTG
Look!  A ladder!  Maybe it leads to heaven, or a sandwich!
Debian 3.0 -- Linux 2.6.14.3
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Faragó János
Kiss Gabor wrote:
> In article <[EMAIL PROTECTED]>,
>   =?UTF-8?B?RmFyYWfDsyBKw6Fub3M=?= <[EMAIL PROTECTED]> writes:
>> Ez szerintem gyorsabb lesz:
>>
>> for ($i=0; $i<$n; $i+=3 )
>> {
>> $x  = $tomb[$i];
>> $tomb[$i]= $tomb[$i+2];
>> $tomb[$i+2] = $x;
>> }
> 
> 4.5 masodperc. :-/


Ez érdekes. Írtam egy kis tesztprogramot a feladatra (elküldöm
magánban). Az általad írt és a fenti megoldás van benne (plusz egy
adatfeltöltés).

A lényegi része a következő:

sub t1()
{
my $i;
my $x;

for ( $i=0; $i<$bnum; $i+=3 )
{
$x  = $array[$i];
$array[$i]  = $array[$i+2];
$array[$i+2]= $x;
}
}


sub t2()
{
$str =~ s/(.)(.)(.)/$3$2$1/g;
}


A progi szerint a tömbös megoldás kb. 2-ször gyorsabb (az én gépemen).

(Az persze könnyen meglehet, hogy a tesztprogram nem jó modellezi a
feladatot.)


Üdv
Fari
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux

Re: PERL, bytecsere

2007-05-21 bef zés Kiss Gabor

In article <[EMAIL PROTECTED]>,
[EMAIL PROTECTED] (Kiss Gabor) writes:
> A jelenleg hasznalt
> $blob =~ s/(.)(.)(.)/$3$2$1/g;
> konstrukcio kb. masfel masodpercig molyol.
> Ez tul sok. 0.2 s ala kellene leszoritani.

$blob = reverse pack('(a3)*', reverse unpack('(a3)*', $blob));

3.3 sec.

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Kiss Gabor

In article <[EMAIL PROTECTED]>,
Pirity Tamas Gabor <[EMAIL PROTECTED]> writes:
> Mennyi p=E9nzed van gyorsabb hardverre?

1179738718 masodperc. :-(

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Kiss Gabor

In article <[EMAIL PROTECTED]>,
=?UTF-8?B?RmFyYWfDsyBKw6Fub3M=?= <[EMAIL PROTECTED]> writes:
> Ez szerintem gyorsabb lesz:
> 
> for ($i=0; $i<$n; $i+=3 )
> {
> $x  = $tomb[$i];
> $tomb[$i] = $tomb[$i+2];
> $tomb[$i+2] = $x;
> }

4.5 masodperc. :-/

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Gabor Gombas
On Mon, May 21, 2007 at 08:02:14AM +, Kiss Gabor wrote:
> 
> Kellene egy gyors otlet arra, hogy PERL-ben hogy lehet a legyorsabban
> felcserelgetni par egymillio byte-ot.
> 
> Pontosabban: egy gigaszi skalarban N*3 byte van. (N kb. 0.8 .. 1.3 millio)
> Minden tripletnek fel kellene cserelni az elso es a harmadik erteket.
> (Csak hogy ertsuk: ezek egy kep pixelei, es az R<->B ertekeket akarom
> kicserelni egymassal.)
> 
> A jelenleg hasznalt
> $blob =~ s/(.)(.)(.)/$3$2$1/g;
> konstrukcio kb. masfel masodpercig molyol.
> Ez tul sok. 0.2 s ala kellene leszoritani.
> 
> Otletek?

T.xs:

MODULE = T  PACKAGE = T 

void
swap3(IN_OUT char *p, int len)
INIT:
int i, tmp;
CODE:
for (i = 0; i < len; i += 3)
{
tmp = p[i];
p[i] = p[i + 2];
p[i + 2] = tmp;
}

Reg volt mar, hogy utoljara ilyent irtam, nem probaltam ki, de nem teljesen
kizart, hogy ez igy jo :-) Tobbi reszlet a "man perlxstut"-ban.

Gabor

-- 
 -
 MTA SZTAKI Computer and Automation Research Institute
Hungarian Academy of Sciences
 -
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


Re: PERL, bytecsere

2007-05-21 bef zés Faragó János
Kiss Gabor wrote:
> Kellene egy gyors otlet arra, hogy PERL-ben hogy lehet a legyorsabban
> felcserelgetni par egymillio byte-ot.

Ebben nem igazán erős a PERL.

> A jelenleg hasznalt
> $blob =~ s/(.)(.)(.)/$3$2$1/g;
> konstrukcio kb. masfel masodpercig molyol.
> Ez tul sok. 0.2 s ala kellene leszoritani.
> 
> Otletek?

Ez nagyon elegáns megoldás, de nem igazán jó a teljesítménye. Én a
helyedben megpróbálnám tömbként kezelni a képet és úgy cserélgetni az
elemeket.

Ez szerintem gyorsabb lesz:

for ($i=0; $i<$n; $i+=3 )
{
$x  = $tomb[$i];
$tomb[$i]   = $tomb[$i+2];
$tomb[$i+2] = $x;
}


Üdv
Fari
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux

Re: PERL, bytecsere

2007-05-21 bef zés Pirity Tamas Gabor
Ha jól hiszem, Kiss Gabor írta az alábbiakat:
> Kellene egy gyors otlet arra, hogy PERL-ben hogy lehet a legyorsabban
> felcserelgetni par egymillio byte-ot.
> 
> Pontosabban: egy gigaszi skalarban N*3 byte van. (N kb. 0.8 .. 1.3 millio)
> Minden tripletnek fel kellene cserelni az elso es a harmadik erteket.
> (Csak hogy ertsuk: ezek egy kep pixelei, es az R<->B ertekeket akarom
> kicserelni egymassal.)
> 
> A jelenleg hasznalt
> $blob =~ s/(.)(.)(.)/$3$2$1/g;
> konstrukcio kb. masfel masodpercig molyol.
> Ez tul sok. 0.2 s ala kellene leszoritani.

Mennyi pénzed van gyorsabb hardverre?

-- 
PTG
A long memory is the most subversive idea in America.
Debian 3.0 -- Linux 2.6.14.3
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux


PERL, bytecsere

2007-05-21 bef zés Kiss Gabor

Kellene egy gyors otlet arra, hogy PERL-ben hogy lehet a legyorsabban
felcserelgetni par egymillio byte-ot.

Pontosabban: egy gigaszi skalarban N*3 byte van. (N kb. 0.8 .. 1.3 millio)
Minden tripletnek fel kellene cserelni az elso es a harmadik erteket.
(Csak hogy ertsuk: ezek egy kep pixelei, es az R<->B ertekeket akarom
kicserelni egymassal.)

A jelenleg hasznalt
$blob =~ s/(.)(.)(.)/$3$2$1/g;
konstrukcio kb. masfel masodpercig molyol.
Ez tul sok. 0.2 s ala kellene leszoritani.

Otletek?

kissg
_
linux lista  -  linux@mlf.linux.rulez.org
http://mlf2.linux.rulez.org/mailman/listinfo/linux