develooper 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


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