Im averaging 20 miliseconds per 1000 get requests + response + parse and check on parsed value. can i improve this? import asyncdispatch, httpclient, json, strutils, times var found = false var checked = 0 const CONCURRENCY = 200 BATCH = 1000 type AsyncSemaphore = ref object count: int waiters: seq[Future[void]] proc newAsyncSemaphore(n: int): AsyncSemaphore = AsyncSemaphore(count: n, waiters: @[]) proc acquire(s: AsyncSemaphore): Future[void] = if s.count > 0: dec s.count result = newFuture[void]("sem.acquire") result.complete() else: result = newFuture[void]("sem.acquire") s.waiters.add(result) proc release(s: AsyncSemaphore) = if s.waiters.len > 0: let waiter = s.waiters[0] s.waiters.delete(0) waiter.complete() else: inc s.count var sem = newAsyncSemaphore(CONCURRENCY) proc checkID(id: int): Future[void] {.async.} = await sem.acquire() let client = newAsyncHttpClient() client.headers = newHttpHeaders({ "Cookie": "JSESSIONID=cookiehere", "X-Requested-With": "XMLHttpRequest", "Accept": "/" }) try: let url = "urlhere" & $id let response = await client.get(url) let body = parseJson(await response.body) if body.hasKey("lessonCompleted") and body["lessonCompleted"].getBool(): echo "[+] Found: ", id found = true except: discard finally: client.close() sem.release() inc checked proc main() {.async.} = echo "Starting with concurrency=", CONCURRENCY echo "Starting with batch=", BATCH var id = 0 while not found: let start = cpuTime() var futures: seq[Future[void]] for i in 0..