Tôi tò mò về cách IEnumerable
khác với IObservable
dưới mui xe. Tôi hiểu các mô hình kéo và đẩy tương ứng nhưng làm thế nào C#, về bộ nhớ vv, thông báo cho thuê bao (cho IObservable) rằng nó sẽ nhận được bit tiếp theo của dữ liệu trong bộ nhớ để xử lý? Làm thế nào để các trường hợp quan sát biết nó đã có một sự thay đổi trong dữ liệu để đẩy đến các thuê bao.Làm thế nào để IEnumerable khác với IObservable dưới mui xe?
Câu hỏi của tôi xuất phát từ một bài kiểm tra tôi đang thực hiện đọc trong các dòng từ một tệp. Tập tin có tổng cộng khoảng 6Mb.
Giờ chuẩn Taken: 4.7s, dòng: 36587
Rx Time Taken: 0.68s, dòng: 36587
thế nào là Rx có thể ồ ạt cải thiện một sự lặp lại bình thường hơn so với từng dòng trong tập tin ?
private static void ReadStandardFile()
{
var timer = Stopwatch.StartNew();
var linesProcessed = 0;
foreach (var l in ReadLines(new FileStream(_filePath, FileMode.Open)))
{
var s = l.Split(',');
linesProcessed++;
}
timer.Stop();
_log.DebugFormat("Standard Time Taken: {0}s, lines: {1}",
timer.Elapsed.ToString(), linesProcessed);
}
private static void ReadRxFile()
{
var timer = Stopwatch.StartNew();
var linesProcessed = 0;
var query = ReadLines(new FileStream(_filePath, FileMode.Open)).ToObservable();
using (query.Subscribe((line) =>
{
var s = line.Split(',');
linesProcessed++;
}));
timer.Stop();
_log.DebugFormat("Rx Time Taken: {0}s, lines: {1}",
timer.Elapsed.ToString(), linesProcessed);
}
private static IEnumerable<string> ReadLines(Stream stream)
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
yield return reader.ReadLine();
}
}
Nếu bạn chuyển đổi thứ tự cuộc gọi của họ khi bạn đánh giá ứng dụng này, RX có còn nhanh hơn không? – user7116
Thời gian bị đảo ngược! Có một số loại tối ưu hóa đang diễn ra! Trong thực tế, Rx chạy chậm hơn (khoảng 5s). – David