From 3c15cf9df294e62a6391af1f94dfd45bf85a54e8 Mon Sep 17 00:00:00 2001 From: Albert Date: Wed, 15 Jun 2022 15:19:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?!optimize=20=E6=97=B6=E9=97=B4=E8=BF=BD?= =?UTF-8?q?=E5=B9=B3=E6=BC=82=E7=A7=BB=E9=87=8F=E6=97=B6=EF=BC=8C=E6=8D=9F?= =?UTF-8?q?=E8=80=97=E4=B8=80=E7=82=B9=E6=97=B6=E9=97=B4(=E5=BE=AE?= =?UTF-8?q?=E5=A6=99=E7=BA=A7=E5=88=AB)=E9=99=8D=E4=BD=8ECPU=E5=8D=A0?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP/src/snowflake/snowflake.c | 52 +++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/PHP/src/snowflake/snowflake.c b/PHP/src/snowflake/snowflake.c index d4325cc..0f32a6e 100644 --- a/PHP/src/snowflake/snowflake.c +++ b/PHP/src/snowflake/snowflake.c @@ -4,6 +4,7 @@ #else #include #include +#include #endif #include #include @@ -11,19 +12,19 @@ #include "spinlock.h" // static void EndOverCostAction(uint64_t useTimeTick, snowflake *flake); -static inline uint64_t NextOverCostId(snowflake* flake); -static inline uint64_t NextNormalId(snowflake* flake); -static inline uint64_t GetCurrentTimeTick(snowflake* flake); -static inline uint64_t GetNextTimeTick(snowflake* flake); -static inline uint64_t CalcId(snowflake* flake); -static inline uint64_t CalcTurnBackId(snowflake* flake); +static inline uint64_t NextOverCostId(snowflake *flake); +static inline uint64_t NextNormalId(snowflake *flake); +static inline uint64_t GetCurrentTimeTick(snowflake *flake); +static inline uint64_t GetNextTimeTick(snowflake *flake); +static inline uint64_t CalcId(snowflake *flake); +static inline uint64_t CalcTurnBackId(snowflake *flake); static inline uint64_t GetSysCurrentTime(); int ncpu; uint16_t spin = 2048; uint32_t pid = 0; -void Config(snowflake* flake) +void Config(snowflake *flake) { if (pid == 0) { @@ -132,7 +133,7 @@ void Config(snowflake* flake) // } // } -static inline uint64_t NextOverCostId(snowflake* flake) +static inline uint64_t NextOverCostId(snowflake *flake) { uint64_t currentTimeTick = GetCurrentTimeTick(flake); if (currentTimeTick > flake->_LastTimeTick) @@ -169,7 +170,7 @@ static inline uint64_t NextOverCostId(snowflake* flake) return CalcId(flake); } -static inline uint64_t NextNormalId(snowflake* flake) +static inline uint64_t NextNormalId(snowflake *flake) { uint64_t currentTimeTick = GetCurrentTimeTick(flake); if (currentTimeTick < flake->_LastTimeTick) @@ -221,39 +222,50 @@ static inline uint64_t GetSysCurrentTime() gettimeofday(&t, NULL); return (uint64_t)(t.tv_sec * 1000 + t.tv_usec / 1000); #endif - } -static inline uint64_t GetCurrentTimeTick(snowflake* flake) +static inline uint64_t GetCurrentTimeTick(snowflake *flake) { return GetSysCurrentTime() - flake->BaseTime; } -static inline uint64_t GetNextTimeTick(snowflake* flake) +static inline uint64_t GetNextTimeTick(snowflake *flake) { uint64_t tempTimeTicker = GetCurrentTimeTick(flake); - while (tempTimeTicker <= flake->_LastTimeTick) + struct timespec delay; + delay.tv_sec = 0; + delay.tv_nsec = 500000; + while (1) { tempTimeTicker = GetCurrentTimeTick(flake); + if (tempTimeTicker > flake->_LastTimeTick) + { + break; + } +#ifdef WIN32 + SwitchToThread(); +#else + nanosleep(&delay, NULL); +#endif } return tempTimeTicker; } -static inline uint64_t CalcId(snowflake* flake) +static inline uint64_t CalcId(snowflake *flake) { uint64_t result = (flake->_LastTimeTick << flake->_TimestampShift) + (flake->WorkerId << flake->SeqBitLength) + (flake->_CurrentSeqNumber); flake->_CurrentSeqNumber++; return result; } -static inline uint64_t CalcTurnBackId(snowflake* flake) +static inline uint64_t CalcTurnBackId(snowflake *flake) { uint64_t result = (flake->_LastTimeTick << flake->_TimestampShift) + (flake->WorkerId << flake->SeqBitLength) + (flake->_TurnBackTimeTick); flake->_TurnBackTimeTick--; return result; } -static inline uint64_t NextSonwId(snowflake* flake) +static inline uint64_t NextSonwId(snowflake *flake) { uint64_t currentTimeTick = GetCurrentTimeTick(flake); if (flake->_LastTimeTick == currentTimeTick) @@ -273,12 +285,12 @@ static inline uint64_t NextSonwId(snowflake* flake) return (uint64_t)((currentTimeTick << flake->_TimestampShift) | (flake->WorkerId << flake->SeqBitLength) | flake->_CurrentSeqNumber); } -static inline uint64_t GetId(snowflake* flake) +static inline uint64_t GetId(snowflake *flake) { return flake->Method == 1 ? (flake->_IsOverCost != 0 ? NextOverCostId(flake) : NextNormalId(flake)) : NextSonwId(flake); } -uint64_t NextId(snowflake* flake) +uint64_t NextId(snowflake *flake) { spin_lock(&flake->_Lock, pid); uint64_t id = GetId(flake); @@ -286,9 +298,9 @@ uint64_t NextId(snowflake* flake) return id; } -uint64_t* NextNumId(snowflake* flake, uint32_t num) +uint64_t *NextNumId(snowflake *flake, uint32_t num) { - uint64_t* arr = (uint64_t*)malloc(sizeof(uint64_t) * num); + uint64_t *arr = (uint64_t *)malloc(sizeof(uint64_t) * num); spin_lock(&flake->_Lock, pid); uint32_t i; for (i = 0; i < num; i++) From d97d3aa98f972c854f0654bdfc00c46209c91613 Mon Sep 17 00:00:00 2001 From: Albert Date: Wed, 9 Nov 2022 17:11:55 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=99=E6=80=81?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E6=97=B6=E5=AE=8F=E9=87=8D=E5=A4=8D=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP/php_snowdrift.h | 6 ++---- PHP/snowdrift.c | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PHP/php_snowdrift.h b/PHP/php_snowdrift.h index e3d96c6..18e6560 100644 --- a/PHP/php_snowdrift.h +++ b/PHP/php_snowdrift.h @@ -51,6 +51,8 @@ extern zend_module_entry snowdrift_module_entry; #define ZEND_ACC_DTOR 0 #endif +#define SD_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(snowdrift, v) + ZEND_BEGIN_MODULE_GLOBALS(snowdrift) uint8_t Method; uint64_t BaseTime; @@ -64,10 +66,6 @@ uint8_t Multi; ZEND_END_MODULE_GLOBALS(snowdrift) -ZEND_DECLARE_MODULE_GLOBALS(snowdrift) - -#define SD_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(snowdrift, v) - #if defined(ZTS) && defined(COMPILE_DL_SNOWDRIFT) ZEND_TSRMLS_CACHE_EXTERN() #endif diff --git a/PHP/snowdrift.c b/PHP/snowdrift.c index 8cd13e7..5351749 100644 --- a/PHP/snowdrift.c +++ b/PHP/snowdrift.c @@ -38,6 +38,8 @@ zend_class_entry snowdrift_ce; static uint16_t wid_num = 0; +ZEND_DECLARE_MODULE_GLOBALS(snowdrift) + /* {{{ PHP_INI */ PHP_INI_BEGIN() From 04a13eee386c66f81ae0e990e46a9d044c875865 Mon Sep 17 00:00:00 2001 From: Albert Date: Tue, 21 Mar 2023 13:58:30 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BC=A0=E7=BB=9F?= =?UTF-8?q?=E7=AE=97=E6=B3=95=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP/tests/003.phpt | 13 ++++++------- PHP/tests/004.phpt | 15 --------------- 2 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 PHP/tests/004.phpt diff --git a/PHP/tests/003.phpt b/PHP/tests/003.phpt index b3d4647..5a0564b 100644 --- a/PHP/tests/003.phpt +++ b/PHP/tests/003.phpt @@ -1,16 +1,15 @@ --TEST-- -Check for snowdrift serial +Check for snowdrift batch get unique --SKIPIF-- --FILE-- --EXPECT-- -bool(true) \ No newline at end of file +int(100000) \ No newline at end of file diff --git a/PHP/tests/004.phpt b/PHP/tests/004.phpt deleted file mode 100644 index 5a0564b..0000000 --- a/PHP/tests/004.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Check for snowdrift batch get unique ---SKIPIF-- - ---FILE-- - ---EXPECT-- -int(100000) \ No newline at end of file From 10409330f30293fd624b4fe8fde073ad58f7d093 Mon Sep 17 00:00:00 2001 From: Albert Date: Tue, 12 Sep 2023 11:47:30 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP/src/snowflake/spinlock.c | 20 ++++++++------------ PHP/src/snowflake/spinlock.h | 10 ++++++++++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/PHP/src/snowflake/spinlock.c b/PHP/src/snowflake/spinlock.c index 977a409..eb7b86a 100644 --- a/PHP/src/snowflake/spinlock.c +++ b/PHP/src/snowflake/spinlock.c @@ -10,7 +10,7 @@ extern int ncpu; extern int spin; -void spin_lock(atomic_t* lock, uint32_t pid) +void spin_lock(atomic_t *lock, uint32_t pid) { int i, n; @@ -22,8 +22,8 @@ void spin_lock(atomic_t* lock, uint32_t pid) InterlockedCompareExchange(lock, pid, 0) == 0 #else __sync_bool_compare_and_swap(lock, 0, pid) -#endif - ) +#endif + ) { return; } @@ -36,11 +36,7 @@ void spin_lock(atomic_t* lock, uint32_t pid) for (i = 0; i < n; i++) { -#ifdef WIN32 - MemoryBarrier(); -#else - __asm("pause"); -#endif + atomic_cpu_pause(); } if (*lock == 0 && @@ -48,8 +44,8 @@ void spin_lock(atomic_t* lock, uint32_t pid) InterlockedCompareExchange(lock, pid, 0) == 0 #else __sync_bool_compare_and_swap(lock, 0, pid) -#endif - ) +#endif + ) { return; } @@ -63,11 +59,11 @@ void spin_lock(atomic_t* lock, uint32_t pid) } } -void spin_unlock(atomic_t* lock, uint32_t pid) +void spin_unlock(atomic_t *lock, uint32_t pid) { #ifdef WIN32 InterlockedCompareExchange(lock, 0, pid); #else __sync_bool_compare_and_swap(lock, pid, 0); -#endif +#endif } diff --git a/PHP/src/snowflake/spinlock.h b/PHP/src/snowflake/spinlock.h index c1535f1..c334407 100644 --- a/PHP/src/snowflake/spinlock.h +++ b/PHP/src/snowflake/spinlock.h @@ -8,4 +8,14 @@ extern void spin_lock(atomic_t *lock, uint32_t pid); extern void spin_unlock(atomic_t *lock, uint32_t pid); +#if defined(WIN32) +#define atomic_cpu_pause() MemoryBarrier(); +#elif defined(__x86_64__) +#define atomic_cpu_pause() __asm__ __volatile__("pause") +#elif defined(__aarch64__) +#define atomic_cpu_pause() __asm__ __volatile__("yield") +#else +#define atomic_cpu_pause() +#endif + #endif