anchor.diff:          printfn "test sparse index %d ms" sw.ElapsedMilliseconds
           result
   
  -    let testSimpleRandom = testRandomQuery AsciiProvider.convertToSimple Reader.simpleQuery
  +    let testSimpleRandom = testRandomQuery AsciiProvider.convertToSimple (fun indices fileName -> SimpleReadWrite.readValues fileName indices)
  +    let testMemoryRandom = testRandomQuery AsciiProvider.convertToSimple (fun indices fileName -> MemoryMappedSimpleRead.readValues fileName indices)
       let testSparseRandom = testRandomQuery AsciiProvider.convertToSparse Reader.sparseQuery 
  +    let testBatchRandom = testRandomQuery AsciiProvider.convertToSimple (fun indices fileName -> BatchOrderedRead.readValues fileName indices)
  +
       let testSmallMarspec() =
           let outerlen = 10
           let innerlen = 10000
  +        let result3 = testBatchRandom "test batch SmallMarspec" [|@"D:\a\data\marspec\MARSPEC_10m\ascii\bathy_10m.asc"|] outerlen innerlen
           let result1 = testSimpleRandom "test simple SmallMarspec" [|@"D:\a\data\marspec\MARSPEC_10m\ascii\bathy_10m.asc"|] outerlen innerlen
           let result2 = testSparseRandom "test sparse SmallMarspec" [|@"D:\a\data\marspec\MARSPEC_10m\ascii\bathy_10m.asc"|] outerlen innerlen
  -        printfn "simple result: %A" result1
  -        printfn "sparse result: %A" result2
  +                
  +//        printfn "simple result: %A" result1
  +//        printfn "sparse result: %A" result2
  +//        printfn "batch result: %A" result2
  +        ()
   
       let testAllBioOracle() =
           ignore // TODO
  
positive.code:         for i=0 to len-1 do
              sw.Restart()
              let indices = [1..innerlen] |> List.map (fun i -> (int64 (r.Next(0, 2160*1080)) ))
              let indices = indices.OrderBy(fun x -> x)
              result <- Array.map (query indices) sbgPaths
              sw.Stop()
              arr.[i] <- sw.ElapsedMilliseconds
  
          printfn "avg %f ms" (Array.averageBy float arr)
          printfn "min %d ms" (Array.min arr)
          printfn "max %d ms" (Array.max arr)
          printfn "sum %d ms" (Array.sum arr)
          result
  
negative.code:         converter fileName sbg
  
      let testRandomQuery converter query name paths outerlen innerlen =
          printfn "START %s %d %d" name outerlen innerlen
          let sbgPaths = paths |> Array.map (testPrepareLoad converter)
          
          let r = new Random(1)
  