## 性能
當涉及到性能時,使用PINQ有兩種截然不同的情況。
* 內存查詢
當利用Traversable或Collection查詢在內存中執行時,這些操作的開銷應該很少。顯然,如果數據集是大得出奇的,你可能會遇到問題。但是對于大多數用例來說,由于延遲查詢和高效的迭代器使用,實際上會帶來可觀的性能優勢。
* 外部查詢
對于任何一個Queryable或者Repository,都有令人擔憂的問題。當查詢這些接口的實現時,為了準確地解釋它們,它們所提供的函數將被解析為表達式樹。這是一個非常昂貴的過程,如果沒有正確的設置這些接口的實現,可能會導致顯著的性能損失。
### 緩存查詢的解析過程
為了解決"將接口實現解析為表達式樹這個耗時過程"的問題,提供了幾個選項。配置Pinq\Caching\CacheProvider類設置默認緩存機制:
* 文件緩存(File Cache) - 將數據緩存在單個文件中,這對于高并發性來說不是最佳的,但適合于那些無法訪問正確的內存緩存的用戶。
~~~
\Pinq\Caching\CacheProvider::setFileCache($filePath);
~~~
* 目錄緩存(Directory Cache) - 將數據緩存在目錄的多個文件中,并發性可能相對較好,但性能不佳,應優先使用適當的內存緩存。
~~~
\Pinq\Caching\CacheProvider::setDirectoryCache($directoryPath);
~~~
* 教條緩存(Doctrine Cache)- 這允許您使用實現了緩存適配器接口的組件中的任何緩存。
~~~
\Pinq\Caching\CacheProvider::setDoctrineCache($cacheImplementation);
~~~
* 數組訪問緩存(ArrayAccess Cache) - 這允許您使用任何實現數組訪問接口的對象的緩存。
~~~
\Pinq\Caching\CacheProvider::setArrayAccessCache($cacheImplementation);
~~~
* 自定義緩存(Custom Cache) - 允許使用任何實現Pinq\Caching\ICacheAdapter接口的緩存。
~~~
\Pinq\Caching\CacheProvider::setCustomCache($cacheImplementation);
~~~
所有上述選項將通過消除在每個請求上都需要進行查詢解析的需要來顯著降低性能損失。應該使用適當的內存緩存(如 Memcache或Redis),來替代文件/目錄緩存。但是文件/目錄緩存對小型應用程序是足夠的,只需要磁盤訪問,而不需要設置真正的緩存那么麻煩。
### 在開發階段
在開發過程中使用緩存可能會有問題,因為查詢更改時,可能會被忽略,并繼續使用原始版本。所以在開發階段你應該使用:
~~~
\Pinq\Caching\CacheProvider::setDevelopmentMode(true);
~~~
當此標志設置為true時,緩存將在每次請求時被清除。但請記住在開始部署到正式的生產環境之前將其禁用。