Bug #50238 [Ana->Fbk]: [PATCH] - Using #defines to improve the performance of the TSRMG macro

From: Date: Sun, 28 Dec 2014 08:18:51 +0000
Subject: Bug #50238 [Ana->Fbk]: [PATCH] - Using #defines to improve the performance of the TSRMG macro
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-189238@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=50238&edit=1 ID: 50238 Updated by: mj@php.net Reported by: yoarvi at gmail dot com Summary: [PATCH] - Using #defines to improve the performance of the TSRMG macro -Status: Analyzed +Status: Feedback Type: Bug Package: Performance problem Operating System: Solaris 5.10 (SPARC) PHP Version: 6SVN-2009-11-20 (SVN) Block user comment: N Private report: N New Comment: Recently the thread safety mode has received a bunch of updates in the course of https://wiki.php.net/rfc/native-tls. Can you please verify if your improvements are still required? Previous Comments: ------------------------------------------------------------------------ [2009-11-20 15:26:58] rasmus@php.net It seems silly that this would make a difference. I guess make the change in trunk. Can't do it in the branches because it would break binary compatibility. ------------------------------------------------------------------------ [2009-11-20 10:29:03] yoarvi at gmail dot com Description: ------------ When compiled for multi-threaded (#ifdef ZTS ) operation, the various subsystems in PHP use dynamically allocated (ts_allocate_id) identifiers to index into the thread-local storage for each subsystem. These dynamically allocated ids are used by macros such as CG, EG, PG, AG. The TSRMG macro is defined as: #define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) The PG macro is defined as: # define PG(v) TSRMG(core_globals_id, php_core_globals *, v) where core_globals_id is extern PHPAPI int core_globals_id; cc -E of PG(connection_status) = PHP_CONNECTION_ABORTED; translates to: (((php_core_globals *) (*((void ***) tsrm_ls))[((core_globals_id)-1)])->connection_status) = 1; and cc -S of the same code results in: .loc 1 108 0 movl %ebx, %eax subl core_globals_id, %eax movl (%esi), %edx sall $2, %eax negl %eax movl (%edx,%eax), %eax movw $1, 144(%eax) I used fixed IDs instead of dynamically allocated ones and noticed a decent improvement in performance (few percentage points) when running a web-based ecommerce-site workload on SPARC CMT hardware. With my changes the PG macro is defined as: # define PG(v) TSRMG(CORE_GLOBALS_ID, php_core_globals *, v) #define CORE_GLOBALS_ID 10 and core_globals_id is extern PHPAPI const ts_rsrc_id core_globals_id; cc -E of the same line of code translates to: (((php_core_globals *) (*((void ***) tsrm_ls))[((10)-1)])->connection_status) = 1; cc -S (my version): .loc 1 108 0 movl (%eax), %eax movl 36(%eax), %eax movw $1, 144(%eax) The relevant discussion can be found here: http://marc.info/?l=php-internals&m=125742200330841&w=2 Reproduce code: --------------- The following patch implements this and incorporates the feedback received on internals: http://bitbucket.org/arvi/arviq/src/tip/arvi-16-ts_allocate_reserved_id Expected result: ---------------- Improved performance when PHP is compiled with support for multi-threading. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=50238&edit=1

« previous php.bugs (#189238) next »