Skip to content

Commit d8968be

Browse files
authored
Merge pull request #297 from githubnext/autoloop/tsb-perf-evolve
[Autoloop: tsb-perf-evolve]
2 parents 8148703 + 237b3f5 commit d8968be

1 file changed

Lines changed: 50 additions & 12 deletions

File tree

src/core/series.ts

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -901,16 +901,34 @@ export class Series<T extends Scalar = Scalar> {
901901
if (allNumeric) {
902902
if (ascending) {
903903
for (let i = 0, si = 0; i < finCount; i++, si += 3) {
904-
const idx = srcBuf[si]!;
905-
perm[pos] = idx;
906-
outData[pos] = vals[idx] as T;
904+
const origIdx = srcBuf[si]!;
905+
const keyLo = srcBuf[si + 1]!;
906+
const keyHi = srcBuf[si + 2]!;
907+
perm[pos] = origIdx;
908+
if (keyHi & 0x80000000) {
909+
_fvalsU32[0] = keyLo;
910+
_fvalsU32[1] = (keyHi ^ 0x80000000) >>> 0;
911+
} else {
912+
_fvalsU32[0] = ~keyLo >>> 0;
913+
_fvalsU32[1] = ~keyHi >>> 0;
914+
}
915+
outData[pos] = _fvals[0] as T;
907916
pos = pos + 1;
908917
}
909918
} else {
910919
for (let i = finCount - 1, si = (finCount - 1) * 3; i >= 0; i--, si -= 3) {
911-
const idx = srcBuf[si]!;
912-
perm[pos] = idx;
913-
outData[pos] = vals[idx] as T;
920+
const origIdx = srcBuf[si]!;
921+
const keyLo = srcBuf[si + 1]!;
922+
const keyHi = srcBuf[si + 2]!;
923+
perm[pos] = origIdx;
924+
if (keyHi & 0x80000000) {
925+
_fvalsU32[0] = keyLo;
926+
_fvalsU32[1] = (keyHi ^ 0x80000000) >>> 0;
927+
} else {
928+
_fvalsU32[0] = ~keyLo >>> 0;
929+
_fvalsU32[1] = ~keyHi >>> 0;
930+
}
931+
outData[pos] = _fvals[0] as T;
914932
pos = pos + 1;
915933
}
916934
}
@@ -926,16 +944,36 @@ export class Series<T extends Scalar = Scalar> {
926944
if (allNumeric) {
927945
if (ascending) {
928946
for (let i = 0, si = 0; i < finCount; i++, si += 3) {
929-
const idx = srcBuf[si]!;
930-
perm[pos] = idx;
931-
outData[pos] = vals[idx] as T;
947+
const origIdx = srcBuf[si]!;
948+
const keyLo = srcBuf[si + 1]!;
949+
const keyHi = srcBuf[si + 2]!;
950+
perm[pos] = origIdx;
951+
// Reverse the IEEE-754 sign-transform to recover the original float bits,
952+
// avoiding a random read into the JS values array.
953+
if (keyHi & 0x80000000) {
954+
_fvalsU32[0] = keyLo;
955+
_fvalsU32[1] = (keyHi ^ 0x80000000) >>> 0;
956+
} else {
957+
_fvalsU32[0] = ~keyLo >>> 0;
958+
_fvalsU32[1] = ~keyHi >>> 0;
959+
}
960+
outData[pos] = _fvals[0] as T;
932961
pos = pos + 1;
933962
}
934963
} else {
935964
for (let i = finCount - 1, si = (finCount - 1) * 3; i >= 0; i--, si -= 3) {
936-
const idx = srcBuf[si]!;
937-
perm[pos] = idx;
938-
outData[pos] = vals[idx] as T;
965+
const origIdx = srcBuf[si]!;
966+
const keyLo = srcBuf[si + 1]!;
967+
const keyHi = srcBuf[si + 2]!;
968+
perm[pos] = origIdx;
969+
if (keyHi & 0x80000000) {
970+
_fvalsU32[0] = keyLo;
971+
_fvalsU32[1] = (keyHi ^ 0x80000000) >>> 0;
972+
} else {
973+
_fvalsU32[0] = ~keyLo >>> 0;
974+
_fvalsU32[1] = ~keyHi >>> 0;
975+
}
976+
outData[pos] = _fvals[0] as T;
939977
pos = pos + 1;
940978
}
941979
}

0 commit comments

Comments
 (0)