Front page | perl.perl5.porters |
Postings from April 2012
Re: [perl #9319] Perl bug -- split function
Thread Previous
|
Thread Next
From:
Dave Mitchell
Date:
April 22, 2012 04:25
Subject:
Re: [perl #9319] Perl bug -- split function
Message ID:
20120422112542.GF2881@iabyn.com
On Sun, Apr 22, 2012 at 12:53:06AM -0700, bulk 88 via RT wrote:
> Ok, actually problem is the mortal system.
>
>
>
> C:\Perl>perl svspeed.pl
> newsv time=0.587146
> mortal time=2.857621
> newsv time=0.579447
> mortal time=9.141501
> newsv time=0.582962
> mortal time=15.362363
> newsv time=0.585780
> mortal time=22.163787
>
> C:\Perl>
>
>
> void
> SVSpeed()
> PPCODE:
> LARGE_INTEGER my_beg;
> LARGE_INTEGER my_end;
> LARGE_INTEGER my_freq;
> SV * sv;
> int i;
> SV ** arr = malloc(sizeof(SV *) * 1000000);
> QueryPerformanceFrequency(&my_freq);
>
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> arr[i] = newSVpvn("x", 1);
> }
> QueryPerformanceCounter(&my_end);
> printf("newsv time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> sv_2mortal(arr[i]);
> }
> QueryPerformanceCounter(&my_end);
> printf("mortal time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> arr[i] = newSVpvn("x", 1);
> }
> QueryPerformanceCounter(&my_end);
> printf("newsv time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> sv_2mortal(arr[i]);
> }
> QueryPerformanceCounter(&my_end);
> printf("mortal time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> arr[i] = newSVpvn("x", 1);
> }
> QueryPerformanceCounter(&my_end);
> printf("newsv time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> sv_2mortal(arr[i]);
> }
> QueryPerformanceCounter(&my_end);
> printf("mortal time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> arr[i] = newSVpvn("x", 1);
> }
> QueryPerformanceCounter(&my_end);
> printf("newsv time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
> QueryPerformanceCounter(&my_beg);
> for(i=0; i < 1000000; i++){
> sv_2mortal(arr[i]);
> }
> QueryPerformanceCounter(&my_end);
> printf("mortal time=%f\n",
> ((double)(my_end.QuadPart-my_beg.QuadPart))/(double)my_freq.QuadPart);
I don't see similar slowdowns on linux with perl 5.15.9; I presume it must
be something to do with the windows malloc not liking repeated realloc()s
of the tmps stack:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include <sys/time.h>
MODULE = Mytest PACKAGE = Mytest
void
hello()
PPCODE:
struct timeval t1, t2;
SV * sv;
int i;
int j;
SV ** arr = malloc(sizeof(SV *) * 1000000);
for (j=1; j<=5; j++) {
gettimeofday(&t1, NULL);
for(i=0; i < 1000000; i++){
arr[i] = newSVpvn("x", 1);
}
gettimeofday(&t2, NULL);
t2.tv_sec -= t1.tv_sec;
t2.tv_usec -= t1.tv_usec;
if (t2.tv_usec < 0) {
t2.tv_sec--;
t2.tv_usec += 1000000;
}
printf("newsv %d time=%d.%06ds\n", j, t2.tv_sec, t2.tv_usec);
gettimeofday(&t1, NULL);
for(i=0; i < 1000000; i++){
sv_2mortal(arr[i]);
}
gettimeofday(&t2, NULL);
t2.tv_sec -= t1.tv_sec;
t2.tv_usec -= t1.tv_usec;
if (t2.tv_usec < 0) {
t2.tv_sec--;
t2.tv_usec += 1000000;
}
printf("mortal %d time=%d.%06ds\n", j, t2.tv_sec, t2.tv_usec);
printf("\n");
}
[davem@pigeon Mytest]$ perl5159o -Mblib /tmp/p
newsv 1 time=0.194811s
mortal 1 time=0.033377s
newsv 2 time=0.185385s
mortal 2 time=0.033189s
newsv 3 time=0.184901s
mortal 3 time=0.031508s
newsv 4 time=0.185011s
mortal 4 time=0.033563s
newsv 5 time=0.184997s
mortal 5 time=0.032119s
Nor can I see any quadratic slowdown with doing
@a = split //, $ling_string,
so again, perhaps its very sensitive to the malloc library?
--
The Enterprise successfully ferries an alien VIP from one place to another
without serious incident.
-- Things That Never Happen in "Star Trek" #7
Thread Previous
|
Thread Next