 			// verify results
 			expect(controller.sections?.count) == 1
 			expect(controller.sections!.first!.numberOfObjects) == times
+		}
+
+		self.mainContext.reset()
+	}
+
+	func testInsertion_10000_FRC_iteration() {
+		measureFRCInsertionPerformance(times: 10000)
+	}
+
+	func testInsertion_2000_FRC_iteration() {
+		measureFRCInsertionPerformance(times: 2000)
+	}
+
+	func testInsertion_1000_FRC_iterations() {
+		measureFRCInsertionPerformance(times: 1000)
+	}
+
+	func testInsertion_100_FRC_iterations() {
+		measureFRCInsertionPerformance(times: 100)
+	}
+
+	func testInsertion_10_FRC_iterations() {
+		measureFRCInsertionPerformance(times: 10)
+	}
+
+
+	func measureFRCReadPerformance(times: Int) {
+		for i in 0 ..< times {
+			let children = Children(context: mainContext)
+			children.value = Int64(i)
+		}
+
+		mainContext.processPendingChanges()
+
+		let controller = Children.query(self.mainContext)
+			.sort(by: .ascending("value"))
+			.makeController()
+
+		let receiver = Receiver()
+		controller.delegate = receiver
+
+		expect { try controller.performFetch() }.toNot(throwError())
+
+		measure {
+			// verify results
+			expect(controller.sections?.count) == 1
+			expect(controller.sections!.first!.numberOfObjects) == times
 
 			for objectIndex in 0 ..< controller.sections!.first!.numberOfObjects {
-				let object = controller.object(at: IndexPath(row: objectIndex, section: 0))
-				expect(object.value) == Int64(objectIndex)
+				XCTAssertTrue(controller.object(at: IndexPath(row: objectIndex, section: 0)).value == Int64(objectIndex))
 			}
 		}
 
 		self.mainContext.reset()
 	}
 
-	func testFRCInsertionPerformance_10000_iteration() {
-		measureFRCInsertionPerformance(times: 10000)
-	}
-
-	func testFRCInsertionPerformance_2000_iteration() {
-		measureFRCInsertionPerformance(times: 2000)
-	}
-
-	func testFRCInsertionPerformance_1000_iterations() {
-		measureFRCInsertionPerformance(times: 1000)
-	}
-
-	func testFRCInsertionPerformance_100_iterations() {
-		measureFRCInsertionPerformance(times: 100)
-	}
-
-	func testFRCInsertionPerformance_10_iterations() {
-		measureFRCInsertionPerformance(times: 10)
+	func testRead_10000_FRC_iteration() {
+		measureFRCReadPerformance(times: 10000)
+	}
+
+	func testRead_2000_FRC_iteration() {
+		measureFRCReadPerformance(times: 2000)
+	}
+
+	func testRead_1000_FRC_iterations() {
+		measureFRCReadPerformance(times: 1000)
+	}
+
+	func testRead_100_FRC_iterations() {
+		measureFRCReadPerformance(times: 100)
+	}
+
+	func testRead_10_FRC_iterations() {
+		measureFRCReadPerformance(times: 10)
 	}
 
 	override func setUp() {

		}

		mainContext = NSManagedObjectContext(parent: .persistentStore(storeCoordinator),
		                                         concurrencyType: .mainQueueConcurrencyType)
	}

	override func tearDown() {

		}
	}

	func testDeletion_10000_FRC_iteration() {
		measureFRCDeletionPerformance(times: 10000)
	}

	func testDeletion_2000_FRC_iteration() {
		measureFRCDeletionPerformance(times: 2000)
	}

	func testDeletion_1000_FRC_iterations() {
		measureFRCDeletionPerformance(times: 1000)
	}

	func testDeletion_100_FRC_iterations() {
		measureFRCDeletionPerformance(times: 100)
	}

	func testDeletion_10_FRC_iterations() {
		measureFRCDeletionPerformance(times: 10)
	}

