develooper Front page | perl.perl5.porters | Postings from April 2012

Re: [perl #9319] Perl bug -- split function

Thread Previous | Thread Next
From:
demerphq
Date:
April 22, 2012 07:04
Subject:
Re: [perl #9319] Perl bug -- split function
Message ID:
CANgJU+WE-v-cdMMFySBphmK27c=Hr2-MH2URcBO6Y2djv_WkyQ@mail.gmail.com
On 22 April 2012 13:25, Dave Mitchell <davem@iabyn.com> wrote:
> 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:

This is a known issue, windows realloc did/does not extend segments.
It always copies. IIRC  we (nicholas) did a patch to SvGROW to
ameliorate this. Maybe growing the stack by 10% each time would reduce
it.

Yves

-- 
perl -Mre=debug -e "/just|another|perl|hacker/"

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About