Project

General

Profile

Actions

Task #55564

closed

Improve GeneralUtility::revExplode performance

Added by Andreas Wolf about 10 years ago. Updated over 6 years ago.

Status:
Closed
Priority:
Should have
Assignee:
Category:
Performance
Target version:
Start date:
2014-02-01
Due date:
% Done:

100%

Estimated time:
TYPO3 Version:
6.2
PHP Version:
Tags:
Complexity:
Sprint Focus:

Description

GeneralUtility::revExplode always inverses the string and does multiple array operations, which are quite expensive. To speed it up, it can be split into several parts:

  1. a regular explode() for "0" parts [i.e. unlimited]
  2. just the string for 1 part
  3. manually split for 2 parts (saves the costly array operations)
  4. the old method for > 2 parts

A quick benchmark showed that 3 only takes half the time of 4 for the case of 2 parts (which currently is the only case in which this method is used in the core).

As this method is used extensively by e.g. GeneralUtility::dirname, this should give a performance increase of 1-2 ms in the backend.


Related issues 3 (0 open3 closed)

Related to TYPO3 Core - Bug #55838: revExplode returns invalid values if no delimiter in stringClosedAlexander Stehlik2014-02-10

Actions
Related to TYPO3 Core - Bug #56405: GeneralUtility::revExplode returns unexpected result to getSingleField_typeFlex_draw()Closed2014-02-28

Actions
Related to TYPO3 Core - Bug #55822: "else if" in GeneralUtility breaks the buildClosedOliver Klee2014-02-09

Actions
Actions #1

Updated by Andreas Wolf about 10 years ago

Quick comparison:

  • method 1
    $explodedValues = explode($delimiter, strrev($string), $count);
    $explodedValues = array_map('strrev', $explodedValues);
    $foo = array_reverse($explodedValues);
  • method 2
    $pos = strrpos($string, $delimiter);
    $explodedValues = array(substr($string, 0, $pos), substr($string, $pos + 1));

Benchmark with these values:

$delimiter = '/';
$string = '/dir1/dir2/someFile.php';
$count = 2;

Results for 100.000 executions, average over 10 runs:

  • method 1: 0.55020709037781
  • method 2: 0.24021787643433 (43 % of method 1)
Actions #2

Updated by Gerrit Code Review about 10 years ago

  • Status changed from Accepted to Under Review

Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/27255

Actions #3

Updated by Gerrit Code Review about 10 years ago

Patch set 2 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/27255

Actions #4

Updated by Gerrit Code Review about 10 years ago

Patch set 3 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/27255

Actions #5

Updated by Gerrit Code Review about 10 years ago

Patch set 4 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/27255

Actions #6

Updated by Andreas Wolf about 10 years ago

  • Status changed from Under Review to Resolved
  • % Done changed from 0 to 100
Actions #7

Updated by Markus Klein about 10 years ago

Regression in #55838

Actions #8

Updated by Markus Klein about 10 years ago

Another severe regression in #56405

Actions #9

Updated by Riccardo De Contardi over 6 years ago

  • Status changed from Resolved to Closed
Actions

Also available in: Atom PDF