diff options
author | Lukas Reschke <lukas@owncloud.com> | 2015-02-09 18:39:52 +0100 |
---|---|---|
committer | Lukas Reschke <lukas@owncloud.com> | 2015-02-09 18:39:52 +0100 |
commit | 74de345c7f82f115308bfbdff88d5940d46e19be (patch) | |
tree | 3d83189466685464240ed02c2ad8eb6b5ac9ee5f /lib | |
parent | c4d9ae8af4dc34cc79cc73d16b7ee62f52cd5b5f (diff) | |
parent | a79757bc37d5c93f4804cac35e1f1ac7641a07a7 (diff) | |
download | nextcloud-server-74de345c7f82f115308bfbdff88d5940d46e19be.tar.gz nextcloud-server-74de345c7f82f115308bfbdff88d5940d46e19be.zip |
Merge pull request #13511 from owncloud/naturalsort_speeeeeed
NaturalSort performance improvements
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/files/fileinfo.php | 7 | ||||
-rw-r--r-- | lib/private/naturalsort.php | 17 |
2 files changed, 13 insertions, 11 deletions
diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index e4a397dcca2..1acb62033dd 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -159,11 +159,10 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { * @return \OCP\Files\FileInfo::TYPE_FILE|\OCP\Files\FileInfo::TYPE_FOLDER */ public function getType() { - if (isset($this->data['type'])) { - return $this->data['type']; - } else { - return $this->getMimetype() === 'httpd/unix-directory' ? self::TYPE_FOLDER : self::TYPE_FILE; + if (!isset($this->data['type'])) { + $this->data['type'] = ($this->getMimetype() === 'httpd/unix-directory') ? self::TYPE_FOLDER : self::TYPE_FILE; } + return $this->data['type']; } public function getData() { diff --git a/lib/private/naturalsort.php b/lib/private/naturalsort.php index 6e259630f79..d511bfa3f66 100644 --- a/lib/private/naturalsort.php +++ b/lib/private/naturalsort.php @@ -12,6 +12,7 @@ namespace OC; class NaturalSort { private static $instance; private $collator; + private $cache = array(); /** * Split the given string in chunks of numbers and strings @@ -21,13 +22,15 @@ class NaturalSort { private function naturalSortChunkify($t) { // Adapted and ported to PHP from // http://my.opera.com/GreyWyvern/blog/show.dml/1671288 + if (isset($this->cache[$t])) { + return $this->cache[$t]; + } $tz = array(); $x = 0; $y = -1; $n = null; - $length = strlen($t); - while ($x < $length) { + while (isset($t[$x])) { $c = $t[$x]; // only include the dot in strings $m = ((!$n && $c === '.') || ($c >= '0' && $c <= '9')); @@ -40,6 +43,7 @@ class NaturalSort { $tz[$y] .= $c; $x++; } + $this->cache[$t] = $tz; return $tz; } @@ -75,14 +79,13 @@ class NaturalSort { // instead of ["test.txt", "test (2).txt"] $aa = self::naturalSortChunkify($a); $bb = self::naturalSortChunkify($b); - $alen = count($aa); - $blen = count($bb); - for ($x = 0; $x < $alen && $x < $blen; $x++) { + for ($x = 0; isset($aa[$x]) && isset($bb[$x]); $x++) { $aChunk = $aa[$x]; $bChunk = $bb[$x]; if ($aChunk !== $bChunk) { - if (is_numeric($aChunk) && is_numeric($bChunk)) { + // test first character (character comparison, not number comparison) + if ($aChunk[0] >= '0' && $aChunk[0] <= '9' && $bChunk[0] >= '0' && $bChunk[0] <= '9') { $aNum = (int)$aChunk; $bNum = (int)$bChunk; return $aNum - $bNum; @@ -90,7 +93,7 @@ class NaturalSort { return self::getCollator()->compare($aChunk, $bChunk); } } - return $alen - $blen; + return count($aa) - count($bb); } /** |