1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//! 巨大なシートに耐えるかを測る
//!
//! 書くのにかかる時間と、読むのにかかる時間を出す。行数を渡せる。
//! メモリの山も見たいときは、macOS なら次のように包んで走らせる。
//!
//! cargo run --release --example scale -- 1000000
//! /usr/bin/time -l ./target/release/examples/scale 1000000
use folio::Error;
use folio::book::{Book, Writer};
use folio::cell::Value;
use std::path::Path;
use std::time::Instant;
/// 行数を渡さなかったときの行数
const ROW: u32 = 500000;
fn main() {
if let Err(error) = run() {
eprintln!("{error}");
std::process::exit(1);
}
}
fn run() -> Result<(), Error> {
let count: u32 = match std::env::args().nth(1) {
Some(text) => text.parse().unwrap_or(ROW),
None => ROW,
};
let path = Path::new("target/scale.xlsx");
let start = Instant::now();
let mut writer = Writer::create(path, &["大"])?;
writer.start("大")?;
for row in 1..=count {
writer.row(&[
format!("名前{}", row % 997).into(),
(row as i64).into(),
(row as f64 * 1.5).into(),
"同じ語".into(),
(row % 2 == 0).into(),
])?;
}
writer.finish()?;
let written = start.elapsed();
let size = std::fs::metadata(path)?.len();
let start = Instant::now();
let mut book = Book::open(path)?;
let mut sheet = book.read("大")?;
let mut seen = 0u64;
let mut total = 0.0;
while let Some(row) = sheet.read()? {
seen += 1;
for cell in &row.cell {
if let Value::Number(number) = &cell.value {
total += number;
}
}
}
println!("書いた {count} 行 {:.2} 秒 {} MB", written.as_secs_f64(), size / 1024 / 1024);
println!("読んだ {seen} 行 {:.2} 秒 数の合計 {total}", start.elapsed().as_secs_f64());
Ok(())
}