Registry / RepositoryTypeScriptRustPython
Rollpie
ReadmeFiles
Versions
Info
Download
0.1.098.9 KB2026-09-14
Version
0.1.0
Copyright
Rollpie, Irohabook
Publisher
math
Published
2026-09-14
Size
98.9 KB
Downloads
1
Checksum
bdac84a1e4fe4dd3505b93c2781b1f15833b5189c2e4ee976225fa3c512885cc
Dependencies
None

scale.rs

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(())
}