PHP गाइड: मेमोइज़ेशन के साथ प्रदर्शन अनुकूलन
PHP में मेमोइज़ेशन को समझना
मेमोइज़ेशन एक अनुकूलन तकनीक है जिसमें फ़ंक्शन कॉल के परिणामों को कैश करना शामिल है। एक ही परिणाम की बार-बार गणना करने के बजाय, हम इसे बाद में पुन: उपयोग के लिए मेमोरी में स्टोर करते हैं। यह दृष्टिकोण विशेष रूप से प्रभावी है:
- गहन गणनाओं वाले फ़ंक्शन
- रिकर्सिव ऑपरेशन
- API कॉल
- जटिल डेटा ट्रांसफॉर्मेशन
बेसिक मेमोइज़ेशन इम्प्लीमेंटेशन
आइए एक सरल और सुरक्षित इम्प्लीमेंटेशन से शुरू करें:
php
1<?php23/**4 * Base class for memoization5 */6class Memoizer7{8 private array $cache = [];9 private array $timestamps = [];1011 /**12 * Memoizes a function13 *14 * @param callable $fn The function to memoize15 * @return callable The memoized function16 */17 public function memoize(callable $fn): callable18 {19 return function (...$args) use ($fn) {20 $key = $this->generateCacheKey($args);2122 if ($this->hasValidCacheEntry($key)) {23 error_log("Cache hit for key: $key");24 return $this->cache[$key];25 }2627 $result = $fn(...$args);28 $this->cache[$key] = $result;29 $this->timestamps[$key] = time();30 error_log("New calculation for key: $key");3132 return $result;33 };34 }3536 /**37 * Generates a unique cache key38 */39 private function generateCacheKey(array $args): string40 {41 return md5(serialize($args));42 }4344 /**45 * Checks if a cache entry is valid46 */47 private function hasValidCacheEntry(string $key): bool48 {49 return isset($this->cache[$key]);50 }5152 /**53 * Clears the cache54 */55 public function clearCache(): void56 {57 $this->cache = [];58 $this->timestamps = [];59 }60}
कॉन्फ़िगरेशन के साथ एडवांस्ड इम्प्लीमेंटेशन
php
1<?php23/**4 * Configuration for advanced memoization5 */6class MemoizeConfig7{8 public function __construct(9 public readonly int $maxCacheSize = 1000,10 public readonly int $ttl = PHP_INT_MAX,11 public readonly ?callable $cacheKeyGenerator = null12 ) {}13}1415/**16 * Cache statistics17 */18class CacheStats19{20 public function __construct(21 public int $hits = 0,22 public int $misses = 0,23 public float $totalAccessTime = 0,24 public int $accessCount = 025 ) {}2627 public function getAverageAccessTime(): float28 {29 return $this->accessCount > 0 ? $this->totalAccessTime / $this->accessCount : 0;30 }31}3233/**34 * Advanced memoization with complete cache management35 */36class AdvancedMemoizer37{38 private array $cache = [];39 private array $timestamps = [];40 private CacheStats $stats;4142 public function __construct(private readonly MemoizeConfig $config = new MemoizeConfig())43 {44 $this->stats = new CacheStats();45 }4647 public function memoize(callable $fn): callable48 {49 return function (...$args) use ($fn) {50 $startTime = microtime(true);51 $key = $this->generateCacheKey($args);52 $now = time();5354 if ($this->hasValidCacheEntry($key, $now)) {55 $this->updateStats(true, $startTime);56 return $this->cache[$key];57 }5859 // Cache size management60 if (count($this->cache) >= $this->config->maxCacheSize) {61 $this->removeOldestEntry();62 }6364 $result = $fn(...$args);65 $this->cache[$key] = $result;66 $this->timestamps[$key] = $now;67 $this->updateStats(false, $startTime);6869 return $result;70 };71 }7273 private function generateCacheKey(array $args): string74 {75 if ($this->config->cacheKeyGenerator) {76 return ($this->config->cacheKeyGenerator)($args);77 }78 return md5(serialize($args));79 }8081 private function hasValidCacheEntry(string $key, int $now): bool82 {83 return isset($this->cache[$key]) &&84 ($now - $this->timestamps[$key] <= $this->config->ttl);85 }8687 private function updateStats(bool $isHit, float $startTime): void88 {89 $accessTime = microtime(true) - $startTime;90 $this->stats->totalAccessTime += $accessTime;91 $this->stats->accessCount++;9293 if ($isHit) {94 $this->stats->hits++;95 } else {96 $this->stats->misses++;97 }98 }99100 private function removeOldestEntry(): void101 {102 $oldestKey = array_key_first($this->timestamps);103 unset($this->cache[$oldestKey], $this->timestamps[$oldestKey]);104 }105106 public function getStats(): array107 {108 return [109 'hits' => $this->stats->hits,110 'misses' => $this->stats->misses,111 'size' => count($this->cache),112 'averageAccessTime' => $this->stats->getAverageAccessTime()113 ];114 }115116 public function clearCache(): void117 {118 $this->cache = [];119 $this->timestamps = [];120 }121}
व्यावहारिक उदाहरण
1. फिबोनाची श्रृंखला की गणना
php
1<?php23$memoizer = new Memoizer();4$fibonacci = $memoizer->memoize(function (int $n) use (&$fibonacci): int {5 if ($n <= 1) return $n;6 return $fibonacci($n - 1) + $fibonacci($n - 2);7});89// उपयोग10echo $fibonacci(30); // मेमोइज़ेशन के साथ बहुत तेज़
2. मेमोइज्ड API रिक्वेस्ट
php
1<?php23class UserAPI4{5 private AdvancedMemoizer $memoizer;67 public function __construct()8 {9 $this->memoizer = new AdvancedMemoizer(new MemoizeConfig(10 maxCacheSize: 100,11 ttl: 300, // 5 मिनट12 cacheKeyGenerator: fn($args) => $args[0] // ID को कुंजी के रूप में उपयोग करता है13 ));14 }1516 public function fetchUser(string $userId): array17 {18 $fetchUserData = $this->memoizer->memoize(function (string $userId) {19 $response = file_get_contents("https://api.example.com/users/{$userId}");20 if ($response === false) {21 throw new RuntimeException("Failed to retrieve user");22 }23 return json_decode($response, true);24 });2526 return $fetchUserData($userId);27 }28}
3. वैलिडेशन के साथ डेटा ट्रांसफॉर्मेशन
php
1<?php23class DataTransformer4{5 private AdvancedMemoizer $memoizer;67 public function __construct()8 {9 $this->memoizer = new AdvancedMemoizer(new MemoizeConfig(10 cacheKeyGenerator: function($args) {11 [$data, $options] = $args;12 return md5(json_encode($data) . '-' . $options['format'] . '-' . $options['version']);13 }14 ));15 }1617 public function transform(array $data, array $options): string18 {19 $transformData = $this->memoizer->memoize(function (array $data, array $options) {20 // जटिल ट्रांसफॉर्मेशन लॉजिक...21 return json_encode($data);22 });2324 return $transformData($data, $options);25 }26}
प्रदर्शन निगरानी
php
1<?php23/**4 * Performance monitoring wrapper5 */6class PerformanceMonitor7{8 private int $calls = 0;9 private float $totalTime = 0;10 private int $cacheHits = 0;1112 public function wrap(callable $fn): callable13 {14 return function (...$args) use ($fn) {15 $start = microtime(true);16 $result = $fn(...$args);17 $this->totalTime += microtime(true) - $start;18 $this->calls++;1920 return $result;21 };22 }2324 public function getMetrics(): array25 {26 return [27 'totalCalls' => $this->calls,28 'averageExecutionTime' => $this->calls > 0 ? $this->totalTime / $this->calls : 0,29 'cacheEfficiency' => $this->calls > 0 ? $this->cacheHits / $this->calls : 030 ];31 }32}
निष्कर्ष
PHP में मेमोइज़ेशन एक शक्तिशाली तकनीक है जो आपके एप्लिकेशन के प्रदर्शन को काफी बेहतर बना सकती है। ये इम्प्लीमेंटेशन प्रदान करते हैं:
- कुशल मेमोरी प्रबंधन
- अनुकूलित प्रदर्शन
- लचीला कॉन्फ़िगरेशन
- निगरानी तंत्र
याद रखने योग्य मुख्य बिंदु
- महंगे ऑपरेशन के लिए मेमोइज़ेशन का उपयोग करें
- कैश साइज को बुद्धिमानी से कॉन्फ़िगर करें
- उचित एक्सपायरी रणनीति लागू करें
- प्रदर्शन और कैश उपयोग की निगरानी करें
मेमोइज़ेशन, अच्छे कैश प्रबंधन के साथ मिलकर, आपको स्वच्छ और रखरखाव योग्य कोड बनाए रखते हुए अपने PHP एप्लिकेशन को अनुकूलित करने की अनुमति देता है! 💪