Cache Policy - Team-HGD/SniffMEET GitHub Wiki
์์ฑ์: ๋ฐฐํ์ง
์ ์ฑ
๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณธ ์ ์ฑ
์บ์ ์์ฑ ์๊ฐ ์ถ๊ฐํ๊ณ , ๋ง๋ฃ ์๊ฐ์ ์ ํด ์บ์ ์์ฑ๋์ง ๋ง๋ฃ ์๊ฐ๋งํผ์ด ์ง๋๋ค๋ฉด ์ญ์
- CacheableImage์ createdDate ์ถ๊ฐ
- expiredTime ์ถ๊ฐ
- ์บ์์ createdDate๋ก๋ถํฐ expiredTime ๋งํผ์ ์๊ฐ์ด ์ง๋ ๊ฒฝ์ฐ ์ญ์
LRU - ์ฌ์ฉ
๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ์ ์งํ๊ณ , ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ์
์ฆ, ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ ์บ์์ ๋จ๊ธฐ๊ณ ์ฌ์ฉ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ค.
- ๋จ์ : ์ฐธ์กฐ๋ ์๊ฐ ๋๋ ์ต๊ทผ ์ฌ์ฉ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํด์ผ ํ๋ค.
- ์ฅ์ : ๋ง์ด ์ฌ์ฉ๋๋ ์บ์ ์ ์ฑ ์ค ํ๋์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์ ์ ์ฑ
ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ NSCache๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์๋ ์บ์ ์ญ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด ์๋ค. ๋ฐ๋ผ์ ์บ์ ์ญ์ ๊ธฐ๋ฅ์ด ์๋ ๋์คํฌ ์บ์์ ์ฐ์ ์ ์ผ๋ก ์ ์ฑ ์ ์ฉ ์๋ํ๋ค.
๋์คํฌ ์บ์ ์ ์ฑ - LRU
- cacheLimit : ๋์คํฌ ์บ์์ ์ต๋ ์ฉ๋ (์บ์์ ์ ์ฅํ ์ต๋ ์ด๋ฏธ์ง ์)
- ์ฉ๋์ด ์๋ ๊ฐ์๋ก ์ ํ์ ์ค์ ํ๊ฒ๋๋ฉด ํฐ ์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ฒฝ์ฐ ์บ์ ์ฉ๋์ ๋น ๋ฅด๊ฒ ์ฐจ์งํด๋๊ฐ ์ ์๋ค. โ ๊ทธ๋ฅ ์ฉ๋์ผ๋ก ์ ํํ๋ ๊ฒ์ด ๋ ๋์๊น? ๊ณ ๋ฏผํ๊ฒ ๋จ
- ํ์ง๋ง ๋ฉ์ดํธ ๋ชฉ๋ก์ ์ฌ์ฉ๋๋ ์ด๋ฏธ์ง๋ค์ ๋ค์ด์ํ๋ง๋ ์ธ๋ค์ผ ์ด๋ฏธ์ง์ด๊ธฐ ๋๋ฌธ์ ํน๋ณํ ํ๋ ์ฉ๋์์ด ์ ์ฅ๋ ์ ์์ ๊ฒ์ด๋ค. โ ์ด๋ฏธ์ง ์๋ก ์ ํํด๋ ๋ฌธ์ ์์ ๊ฒ.
- ๊ฐ์๋ก ์ ์ฑ ์ ์ค์ ํ๋ ๊ฒ์ ๋ํด์๋ ์ข๋ค๊ณ ๋ ์๊ฐ์ด ๋ค์ง ์๋ค์ใ ์ ํฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ก ๋ค์ด์ํ๋ง์ ํ์ง ์์ผ๋๊น ์น๊ตฌ๊ฐ ์ ๋ก๋ํ ์ด๋ฏธ์ง์ ๋ฐ๋ผ์ ๋์คํฌ์บ์์ ์ฐจ์งํ๋ ์ฉ๋์ด ์ฒ์ฐจ๋ง๋ณ์ด ๋ ๊ฒ ๊ฐ์์.
- usageOrder : ๋์คํฌ ์บ์์ ์ฌ์ฉ๋ ์์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฐ์ด
- ์บ์๊ฐ ์ฌ์ฐธ์กฐ๋์ด ์ฌ์ฉ๋๋ค๋ฉด ํด๋น ๋ฐฐ์ด์์ ์์๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผํจ
- updateDiskUsageOrder()
- ์ง์ ๋ ๋์คํฌ ์บ์ ์ด๋ฏธ์ง ์(cacheLimit)๋ฅผ ๋์ด์ ๋ค๋ฉด ๋ฐฐ์ด ์ ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํด์ผํจ
- removeOldestDiskImage()
- ์บ์๊ฐ ์ฌ์ฐธ์กฐ๋์ด ์ฌ์ฉ๋๋ค๋ฉด ํด๋น ๋ฐฐ์ด์์ ์์๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผํจ
๋ฉ๋ชจ๋ฆฌ ์บ์ ์ ์ฑ - NSCache ๋ด๋ถ ์ ์ฑ
LRU์ LFU๋ฅผ ํผํฉํ ์ ์ฑ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๊ฐ์ฅ ์ค๋์ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ธํ๊ณ ๊ทธ ์ฑ ์ฒด๊ฐ ์ฐธ์กฐ๋ ํ์๊ฐ ์บ์๊ฐ ๊ฐ์ง ํ๊ท ์ฐธ์กฐ ํ์๋ณด๋ค ๋๋ค๋ฉด ์์ฃผ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ด๋ฏ๋ก, ๋ค์ ์ฐธ์กฐ ๊ฐ๋ฅ์ฑ์ด ์๊ฒจ ์ญ์ ๋์์ผ๋ก ์ ํ์ง๋ ์๋๋ค.
์ฆ, ์ฐธ์กฐํ์ง ๊ฐ์ฅ ์ค๋๋ ๊ฐ์ฒด ์ค ์ฐธ์กฐ ํ์๊ฐ ํ๊ท ์ฐธ์กฐ ํ์๋ณด๋ค ์ ์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค.
[iOS] NSCache์ ์บ์ ์ ์ฑ ๋ฏ์ด๋ณด๊ธฐ
์บ์ฑ์ผ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ๋ ์์คํ ๋ฆฌ์์ค์ ๋ถ๋ด์ ์ค ์ ์์ด NSCache๋ cachesDirectory์ ์๋ ์ญ์ ๊ธฐ๋ฅ์ ์์กดํ๊ธฐ๋ณด๋ค๋, ์ฑ์ ์ํฉ์ ๋ง๋ ์ ์ ํ ์บ์ ์ ์ฑ ์ ์๋ฆฝํ์ฌ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ํ๋ค.
ํ์ง๋ง, NSCache๋ฅผ ์ฌ์ฉํ๋ฉด Thread-Safe ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก DispatchQueue๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ lock๋ฅผ ์ด์ฉํ ํ์๊ฐ ์๊ณ ์ข ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๋ง์ฝ LRU๋ก ๋ณ๊ฒฝํ๋ค๋ฉด?
๋ฉ๋ชจ๋ฆฌ ์บ์ ์ ์ฑ ์ NSCache๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ์ฌ์ฉํ์ง ์๊ณ , LRU๋ฅผ ์ด์ฉํ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด ์บ์ ์ ๊ฑฐ ๊ธฐ์ค์ ์ง์ ์ง์ (๋์คํฌ ์บ์ ์ ํ์ฒ๋ผ)ํ ์ ์๋ค.
๋์คํฌ ์บ์์ LRU ์ ์ฑ ์ ์ฉํ ๊ฒ๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ . ์์๋ค. ๋ค๋ฅธ ์ ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋์ ๋๋ฆฌ๊ฐ ํ์๋ก ํด์ง๋ค๋ ์ ์ด๋ค. ์ด ๋์ ๋๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์บ์์ ์ญํ ์ ํ๊ฒ๋๋ค.
private var cachedImages: [String: CacheableImage] = [:]
private var usageOrder: [String] = []
private let cacheLimit: Int = 100
func saveMemoryCache(urlString: String, cacheableImage: CacheableImage) {
// NSCache ๋ฐฉ์
// cache.setObject(cacheableImage, forKey: urlString as NSString)
if cachedImages[urlString] == nil && cachedImages.count >= cacheLimit {
removeOldestImage()
}
cachedImages[urlString] = cacheableImage
updateUsageOrder(for: urlString)
}
func imageFromMemoryCache(urlString: String) -> CacheableImage? {
// NSCache ๋ฐฉ์
// return cache.object(forKey: urlString as NSString)
guard let image = cachedImages[urlString] else { return nil }
updateUsageOrder(for: urlString)
return image
}
private func updateUsageOrder(urlString: String) {
if let index = usageOrder.firstIndex(of: urlString) {
usageOrder.remove(at: index)
usageOrder.append(urlString)
}
}
private func removeOldestImage() {
guard let oldestImage = usageOrder.first else { return }
cachedImages.removeValue(forKey: oldestImage)
usageOrder.removeFirst()
}
์บ์ ์ ์ฑ ์ ์ฉ ํ์ธ
ํ ์คํธ๋ฅผ ์ํด ๋์คํฌ ์บ์ ์ ํ์ ์ด๋ฏธ์ง 5๊ฐ๋ก ๋์๋ค.
๋ฉ์ดํธ ๋ชฉ๋ก์ 4๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ, (์ฑ ์ฒซ ๋น๋ ์์ ์ด๋ผ ์ ๋ถ ์๋ก ์บ์์ ์ ์ฅ๋๋ ์ค) ์ ์์ ์ผ๋ก ์บ์์ ์ถ๊ฐ๋๊ณ , usageOrderCount๊ฐ ์ฆ๊ฐํจ์ ํ์ธํ ์ ์๋ค.
์ดํ ๋ฐ์ดํฐ๋ฅผ 1๊ฐ์ฉ ์ถ๊ฐํ๋ฉฐ ํ์ธํด๋ณด์๋ค.
๋ฐ์ดํฐ 5๊ฐ
โ ๋ฌธ์ ๋ ๋ณํ ์์ด usageOrderCount๊ฐ 5๋ก ๋ณ๊ฒฝ๋๋ฉฐ ์บ์์ ์ถ๊ฐ๋์๋ค.
๋ฐ์ดํฐ 6๊ฐ
โ usageOrderCount๊ฐ 6์ผ๋ก ๋ณ๊ฒฝ๋์๋ค. ์ด๋, ์ ํ๊ฐ์ ๋์ด์๊ฒ ๋์ด ์บ์ ์ญ์ ๊ฐ ์งํ๋๋ค. Disk cache contents ๋ก๊ทธ ๋ถ๋ถ์ ํ์ธํ๋ฉด ๊ฐ์ฅ ์ด๊ธฐ ๊ฐ์ด ์ญ์ ๋์ด 5๊ฐ๋ก ์ ์ง๋จ์ ํ์ธํ ์ ์๋ค.
์ฌ๊ธฐ์ ์์ํ ์ ์ด ์๊ฒผ๋ค.
์ ์์ ์ ์ง๊ฐ ์๋๋ ๊ฒ์ผ๊น??
์ง๊ธ ๋ก๊ทธ์ ์ฐํ ๋ด์ฉ์ ํ์ธํด๋ณด๋ฉด, ๊ฐ์ฅ ๋จผ์ ์์นํ ๋ฐ์ดํฐ๊ฐ ์ ์ญ์ ๋์ง๋ง, ์๋ก ์ถ๊ฐ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ์ฅ๋์ง ์๊ณ ์ค๊ฐ์ ์์นํ๊ฒ ๋๊ณ ์๋ค.
์์ธ์ content๊ฐ ๋์คํฌ ์บ์ ํ์ผ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ผ๋ ์ ์ด์๋ค.
usageOrder๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด๋ฉด, ์์๊ฐ ์ ์์ ์ผ๋ก ์ ์ฉ๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ
์์ ๊ตฌํ ์ํ์์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ํ์ง ์์ ๋ชจ๋ ๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ค.
๋์คํฌ ์บ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ๋ ๊ณผ์ ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ฌ ํ๋ฒ์ ๋ง์ ์ด๋ฏธ์ง๊ฐ ์ฒ๋ฆฌ๋์ด๋ ๋ฌธ์ ์๋๋ก ๊ฐ์ ์๋ํ๋ค.
Actor ์ฌ์ฉ
- ๋์คํฌ ์บ์์์๋ usageOrder ์ํ๋ฅผ ๊ด๋ฆฌํด์ค ํ์๊ฐ ์๋ค. ์ฌ๊ธฐ์ ๋์์ฑ ๋ฌธ์ ๋ฅผ Actor๋ฅผ ์ด์ฉํ๋ฉด ๋ฐฉ์งํ ์ ์๋ค.
- ๋์คํฌ ์บ์์์ ์ด๋ฏธ์ง ์ ์ฅ๊ณผ ๋ก๋๊ฐ ๋์์ ๋ฐ์ํ๋๋ผ๋ Actor๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฒ์ ํ ์ค๋ ๋์ ์ ๊ทผํ๋๋ก ๋ณด์ฅ๋๋ค.
- ์ฆ, ๋์์ฑ ๋ฌธ์ ์ ์ถฉ๋ ์์ด ๊ด๋ฆฌํ ์ ์๋ค.
- Actor๋ฅผ ์ฌ์ฉํ๋ฉฐ async await์ ์ด์ฉํด ๋น๋๊ธฐ ์ฒ๋ฆฌํจ์ผ๋ก์จ ํ์ธ์ด ๋ ๊ฐ๋จํ๋ค.
์ ์ฉ
๊ธฐ์กด ์ฝ๋๋ ImageNSCacheManager ์์์ ์ ์ฒด์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์๊ฐ ์ ์ฉ๋๊ณ ์์๋ค.
๋์คํฌ ์บ์ ๋ถ๋ถ์๋ง Actor๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ DiskCacheManager๋ก ๋ฐ๋ก ๋ถ๋ฆฌํด ๊ตฌํํ๋ค.
์ด๋, ๋์คํฌ ์บ์ ์คํ ํจ์๋ค์ด ๋ถ๋ฆฌ๋์์ด๋, ๊ทธ ํธ์ถ์ ImageNSCacheManager์์ ๊ทธ๋๋ก ์ด๋ค์ง๊ณ ์์๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ช ์ CacheManager๋ก ๋ณ๊ฒฝํ์๋ค.
- ๋์คํฌ ์บ์ Actor๋ก ๋ถ๋ฆฌ
actor DiskCacheManager {
private let encoder = JSONEncoder()
private let decoder = JSONDecoder()
private var usageOrder: [String] = []
private let cacheLimit: Int = 50
private let cacheDirectoryPath: URL
init(cacheDirectoryPath: URL) {
...
}
func saveToDist(urlString: String, cacheableImage: CacheableImage) async throws {
...
}
func loadFromDist(urlString: String) async throws -> CacheableImage? {
...
}
private func updateDiskUsageOrder(urlString: String) async {
...
}
private func removeOldestDiskImage() async {
...
}
private func printDiskCacheDirectory() {
...
}
}
์๊ฐ ๋ณต์ก๋ ๊ฐ์
ํ์ฌ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๊ฐฑ์ ํด ๊ฐ์ฅ ์ค๋์ ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋๋ฐ ๋ฐฐ์ด์ ์ด์ฉํ๊ณ ์์๋ค.
ํ์ง๋ง ๋ฐฐ์ด์ ์ด์ฉํ๊ฒ ๋๋ฉด ๊ฐ์ ๊ฒ์ํ๊ฑฐ๋ ์ ๊ฑฐํ ๊ฒฝ์ฐ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(n) ์ด์๋ค.
์๋์ ๋ฉ์ดํธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ ์ํ์์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ฉ์ดํธ ๋ฐ์ดํฐ๊ฐ ๋๋์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ ํ๊ณ ์ ํ๋ค.
์ฒ์์๋ ์บ์ ์๊ฐ๋ณต์ก๋ ๊ฐ์ ์ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ธ Double Linked List ์ฌ์ฉ์ ๊ณ ๋ คํ๋ค.
์ด๋ฅผ ์ด์ฉํ๋ฉด, ์ฌ์ฉ ์์๋ฅผ ์ ์งํ๊ณ ๋ ธ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋์ ๋๋ฆฌ ํํ๋ก ์ ์ฅํด ํค๋ฅผ ๊ฒ์ํ๊ณ ๋ ธ๋ ์ ๋๋ฅผ ์ ๋ฐ์ดํธํด์ค ์ ์๋ค. ๋ชจ๋ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
ํ์ง๋ง, ํ์๋ค๊ณผ ์๊ฒฌ์ ๋๋๋ ๊ณผ์ ์์ Swift Collections ํจํค์ง๋ฅผ ์ถ๊ฐํด ์ฌ์ฉํ ์ ์๋ OrderedSet์ ์ด์ฉํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค. ์ด ๊ณผ์ ์์, OrderedSet์ด ๋ฐ์ดํฐ ์ถ๊ฐ์ ์ญ์ ์๋ ์๊ฐ๋ณต์ก๋๊ฐ O(1)์ด์ง๋ง ์กฐํ์ ๊ฒฝ์ฐ์ O(logn)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ Double Linked List ์ฌ์ฉ์ด ๋ ๊ฐ์ ๋๋ ๋ถ๋ถ์ด ํฌ์ง ์์๊น ํ๋ ์๊ฒฌ๋ ์กด์ฌํ๋ค. ํ์ง๋ง, ์บ์ ์ ์ฑ ์์ OrderedSet์ ์กฐํ ์์ด ์ถ๊ฐ์ ์ญ์ ๋ง ์ด์ฉ๋๋ค๋ ์ ์์ ์ข ๋ ์ฌ์ฉ์ด ๊ฐํธํ OrderedSet์ ์ ์ฉํด๋ณด๊ธฐ๋ก ์ต์ข ๊ฒฐ์ ํ์๋ค.
Swift Collections ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ณ OrderedSet์ ์ด์ฉํด LRU ์ ์ฑ ์ ์ ์ฉํ์๋ค.
์ ์์ ์ผ๋ก ๋์๋จ์ ํ์ธํ ์ ์์๋ค.
ํ์ง๋ง, ๊ทธ ์ดํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ, CI ํ ์คํธ ์คํ ๊ณผ์ ์์ OrderedSet ๊ด๋ จํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ ์ํฌํ๋ก์ฐ๊ฐ ์คํจ๋ก ๋๋๋ค๋ ์ ์ด์๋ค. ์ด ๋ถ๋ถ์ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ์์ผ๋ฉฐ, ํด๊ฒฐ๋๋ฉด ํธ๋ฌ๋ธ์ํ ์ผ๋ก ๋ฐ๋ก ๊ธฐ๋กํ๋ ค๊ณ ํ๋ค.
๊ฐ์ ์ธก์
- 14 Pro 18.1.1 ๊ธฐ์ค
- ์๋ก ์ถ๊ฐ๋์ด ์บ์ ์กด์ฌํ์ง ์๋ ์ํ ๊ธฐ์ค
์ ์กฐ๊ฑด์ ๋์ผํ๊ฒ ํ์ฌ ์๋ 6๊ฐ์ง ํญ๋ชฉ์ ์ธก์ ํด ๋น๊ตํ๊ณ ์ ํ๋ค.
- ์๋์ ๋ฉ์ดํธ ๋ฐ์ดํฐ (4๊ฐ) โ profiling ๋ธ๋์น ๊ธฐ์ค์ผ๋ก ์ฌ์ธก์ ํ์
- ๋ค๋์ ๋ฉ์ดํธ ๋ฐ์ดํฐ (40๊ฐ) โ profiling ๋ธ๋์น ๊ธฐ์ค์ผ๋ก ์ฌ์ธก์ ํ์
- ์๋์ ๋ฉ์ดํธ ๋ฐ์ดํฐ (4๊ฐ) + ๋น๋๊ธฐ
- ๋ค๋์ ๋ฉ์ดํธ ๋ฐ์ดํฐ (40๊ฐ) + ๋น๋๊ธฐ
- ์๋์ ๋ฉ์ดํธ ๋ฐ์ดํฐ (4๊ฐ) + ๋น๋๊ธฐ + ์๊ฐ๋ณต์ก๋ ๊ฐ์ (OrderedSet)
- ๋ค๋์ ๋ฉ์ดํฐ ๋ฐ์ดํฐ (40๊ฐ) + ๋น๋๊ธฐ + ์๊ฐ๋ณต์ก๋ ๊ฐ์
ํ์ฌ Instruments ๋์ ๋ฉ์ถค ๋ฌธ์ ๋ก ์ธํด ์ธก์ ์ด ๋ฐ๋ฆฌ๊ณ ์๋ ์ค์ด๋ค. ๊ณ์ํด์ ๋์ผ ํ์ ๋ฐ์ํ๋ค๋ฉด, ๋ค๋ฅธ ํ์ ๊ธฐ๊ธฐ๋ก ์ธก์ ์๋ํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.