Skip to content

Commit dc3c3ac

Browse files
authored
Avoid nil-ing VMArray twice and improve strEqual and VMString inlining (#55)
median 0% (min. -15%, max. 26%) https://rebench.dev/SOMpp/compare/8a8617cb121513096e3b87244c8899ac6251be2c..1e17f763dd1f34d0f99c14eb403d0eedd6e27452
2 parents 8a8617c + 1e17f76 commit dc3c3ac

File tree

5 files changed

+37
-45
lines changed

5 files changed

+37
-45
lines changed

src/primitives/String.cpp

+13-8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <cctype>
3030
#include <cstdint>
3131
#include <cstdio>
32+
#include <cstring>
3233
#include <string>
3334

3435
#include "../misc/defs.h"
@@ -74,7 +75,7 @@ static vm_oop_t strLength(vm_oop_t rcvr) {
7475
}
7576

7677
static vm_oop_t strEqual(vm_oop_t leftObj, vm_oop_t op1) {
77-
VMString* op2 = static_cast<VMString*>(leftObj);
78+
VMString* left = static_cast<VMString*>(leftObj);
7879

7980
if (IS_TAGGED(op1)) {
8081
return load_ptr(falseObject);
@@ -85,14 +86,18 @@ static vm_oop_t strEqual(vm_oop_t leftObj, vm_oop_t op1) {
8586
}
8687

8788
VMClass* otherClass = CLASS_OF(op1);
88-
if (otherClass == load_ptr(stringClass) ||
89-
otherClass == load_ptr(symbolClass)) {
90-
StdString s1 = static_cast<VMString*>(op1)->GetStdString();
91-
StdString s2 = op2->GetStdString();
89+
if (otherClass != load_ptr(stringClass) &&
90+
otherClass != load_ptr(symbolClass)) {
91+
return load_ptr(falseObject);
92+
}
9293

93-
if (s1 == s2) {
94-
return load_ptr(trueObject);
95-
}
94+
VMString* right = static_cast<VMString*>(op1);
95+
if (left->length != right->length) {
96+
return load_ptr(falseObject);
97+
}
98+
99+
if (strncmp(left->chars, right->chars, left->length) == 0) {
100+
return load_ptr(trueObject);
96101
}
97102
return load_ptr(falseObject);
98103
}

src/vmobjects/VMArray.cpp

-8
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,6 @@
4040

4141
const size_t VMArray::VMArrayNumberOfFields = 0;
4242

43-
VMArray::VMArray(size_t arraySize, size_t additionalBytes)
44-
: VMObject(
45-
arraySize + 0 /* VMArray is not allowed to have any fields itself */,
46-
additionalBytes + sizeof(VMArray)) {
47-
assert(VMArrayNumberOfFields == 0);
48-
nilInitializeFields();
49-
}
50-
5143
VMArray* VMArray::Copy() const {
5244
VMArray* copy = Universe::NewArray(GetNumberOfIndexableFields());
5345

src/vmobjects/VMArray.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ class VMArray : public VMObject {
3939
public:
4040
typedef GCArray Stored;
4141

42-
explicit VMArray(size_t arraySize, size_t additionalBytes);
42+
explicit VMArray(size_t arraySize, size_t additionalBytes)
43+
: VMObject(arraySize +
44+
0 /* VMArray is not allowed to have any fields itself */,
45+
additionalBytes + sizeof(VMArray)) {
46+
assert(VMArrayNumberOfFields == 0);
47+
}
4348

4449
// VMArray doesn't need to customize `void WalkObjects(walk_heap_fn)`,
4550
// because it doesn't need anything special.

src/vmobjects/VMString.cpp

-19
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,6 @@ VMString* VMString::CloneForMovingGC() const {
4343
VMString(length, chars);
4444
}
4545

46-
void VMString::MarkObjectAsInvalid() {
47-
for (size_t i = 0; i < length; i++) {
48-
chars[i] = 'z';
49-
}
50-
chars = (char*)INVALID_GC_POINTER;
51-
}
52-
53-
bool VMString::IsMarkedInvalid() const {
54-
return chars == (char*)INVALID_GC_POINTER;
55-
}
56-
57-
void VMString::WalkObjects(walk_heap_fn) {
58-
// nothing to do
59-
}
60-
6146
size_t VMString::GetObjectSize() const {
6247
size_t size = sizeof(VMString) + PADDED_SIZE(length);
6348
return size;
@@ -67,10 +52,6 @@ VMClass* VMString::GetClass() const {
6752
return load_ptr(stringClass);
6853
}
6954

70-
size_t VMString::GetStringLength() const {
71-
return length;
72-
}
73-
7455
std::string VMString::GetStdString() const {
7556
if (chars == 0) {
7657
return std::string("");

src/vmobjects/VMString.h

+18-9
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,30 @@ class VMString : public AbstractVMObject {
5252
return (int64_t)hash;
5353
}
5454

55-
inline char* GetRawChars() const;
55+
inline char* GetRawChars() const { return chars; }
56+
5657
StdString GetStdString() const;
57-
size_t GetStringLength() const;
58+
59+
inline size_t GetStringLength() const { return length; }
5860

5961
VMString* CloneForMovingGC() const override;
6062
VMClass* GetClass() const override;
6163
size_t GetObjectSize() const override;
62-
void WalkObjects(walk_heap_fn) override;
6364

64-
void MarkObjectAsInvalid() override;
65-
bool IsMarkedInvalid() const override;
65+
inline void WalkObjects(walk_heap_fn) override {
66+
// nothing to do
67+
}
68+
69+
void MarkObjectAsInvalid() override {
70+
for (size_t i = 0; i < length; i++) {
71+
chars[i] = 'z';
72+
}
73+
chars = (char*)INVALID_GC_POINTER;
74+
}
75+
76+
bool IsMarkedInvalid() const override {
77+
return chars == (char*)INVALID_GC_POINTER;
78+
}
6679

6780
StdString AsDebugString() const override;
6881

@@ -80,7 +93,3 @@ class VMString : public AbstractVMObject {
8093
length(length),
8194
chars(adaptedCharsPointer) {}; // constructor to use by VMSymbol
8295
};
83-
84-
char* VMString::GetRawChars() const {
85-
return chars;
86-
}

0 commit comments

Comments
 (0)