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