Forráskód Böngészése

[Core] Fix performance issues in some `CowData` methods

These relied on `get` which does a bounds check each time on debug
builds
A Thousand Ships 7 hónapja
szülő
commit
dbaf8f3e7a
1 módosított fájl, 12 hozzáadás és 12 törlés
  1. 12 12
      core/templates/cowdata.h

+ 12 - 12
core/templates/cowdata.h

@@ -436,20 +436,19 @@ Error CowData<T>::_realloc(Size p_alloc_size) {
 
 template <typename T>
 typename CowData<T>::Size CowData<T>::find(const T &p_val, Size p_from) const {
-	Size ret = -1;
-
-	if (p_from < 0 || size() == 0) {
-		return ret;
+	if (p_from < 0) {
+		return -1;
 	}
 
-	for (Size i = p_from; i < size(); i++) {
-		if (get(i) == p_val) {
-			ret = i;
-			break;
+	const Size s = size();
+
+	for (Size i = p_from; i < s; i++) {
+		if (_ptr[i] == p_val) {
+			return i;
 		}
 	}
 
-	return ret;
+	return -1;
 }
 
 template <typename T>
@@ -464,7 +463,7 @@ typename CowData<T>::Size CowData<T>::rfind(const T &p_val, Size p_from) const {
 	}
 
 	for (Size i = p_from; i >= 0; i--) {
-		if (get(i) == p_val) {
+		if (_ptr[i] == p_val) {
 			return i;
 		}
 	}
@@ -474,8 +473,9 @@ typename CowData<T>::Size CowData<T>::rfind(const T &p_val, Size p_from) const {
 template <typename T>
 typename CowData<T>::Size CowData<T>::count(const T &p_val) const {
 	Size amount = 0;
-	for (Size i = 0; i < size(); i++) {
-		if (get(i) == p_val) {
+	const Size s = size();
+	for (Size i = 0; i < s; i++) {
+		if (_ptr[i] == p_val) {
 			amount++;
 		}
 	}