Ich baute ein Perl Inline::C Modul, aber es gibt einige Kuriositäten mit der Sortierung. Weiß jemand, warum es so aussehen würde? Warum ist das 4.0e-5 nicht zuerst?Warum funktioniert Perls Inline :: C 4.0e-5 nach 4.4e-5?
my $ref = [ 5.0e-5,4.2e-5,4.3e-5,4.4e-5,4.4e-5,4.2e-5,4.2e-5,4.0e-5];
use Inline C => <<'END_OF_C_CODE';
void test(SV* sv, ...) {
I32 i;
I32 arrayLen;
AV* data;
float retval;
SV** pvalue;
Inline_Stack_Vars;
data = SvUV(Inline_Stack_Item(0));
/* Determine the length of the array */
arrayLen = av_len(data);
// sort
sortsv(AvARRAY(data),arrayLen+1,Perl_sv_cmp_locale);
for (i = 0; i < arrayLen+1; i++) {
pvalue = av_fetch(data,i,0); /* fetch the scalar located at i .*/
retval = SvNV(*pvalue); /* dereference the scalar into a number. */
printf("%f \n",newSVnv(retval));
}
}
END_OF_C_CODE
Test ($ ref);
0,000042
0,000042
0,000042
0,000043
0,000044
0,000044
0,000040
0,000050
I möchte die Sortierung im Inline :: C-Bereich für Geschwindigkeit haben. Dies kann das Problem sein, aber wie man sortsv() zum Sortieren numerisch bekommt, ist nicht gut dokumentiert. –
Sie werden keine Geschwindigkeit daraus bekommen. Die Sortierfunktion in Perl ist in C geschrieben. –
Nun, wenn Sie die Funktion, die Sie _passing_ auf die Sortierfunktion bedeuten, dass eine Geschwindigkeitsanhebung erhalten kann, aber es müsste ziemlich kompliziert sein. –