rutrum / convert-case

Converts to and from various cases.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add benches

daxartio opened this issue · comments

I compared this crate with ChatGPT's code. And ChatGPT's code was faster than this one.

Maybe we need to optimize the algorithm for converting a case.

What was ChatGPT's code?

Sure!

#![feature(test)]

extern crate test;

use convert_case::{Case, Casing};

fn to_camel(s: &str) -> String {
    let mut result = String::with_capacity(s.len());
    let mut capitalize_next = false;
    for c in s.chars() {
        if c == ' ' || c == '_' || c == '-' {
            capitalize_next = true;
        } else {
            if capitalize_next {
                result.push(c.to_ascii_uppercase());
                capitalize_next = false;
            } else {
                result.push(c.to_ascii_lowercase());
            }
        }
    }
    result
}

fn to_snake(s: &str) -> String {
    let mut result = String::with_capacity(s.len());
    let mut upper_count = 0;
    for (i, c) in s.chars().enumerate() {
        if c.is_uppercase() {
            upper_count += 1;
            if i > 0 && upper_count < 2 {
                result.push('_');
            }
            result.push(c.to_ascii_lowercase());
        } else {
            if upper_count > 1 {
                if let Some(last_c) = result.pop() {
                    result.push('_');
                    result.push(last_c);
                }
            }
            upper_count = 0;
            result.push(c);
        }
    }
    result
}

#[cfg(test)]
mod tests {
    use super::*;
    use test::Bencher;

    #[test]
    fn it_works() {
        assert_eq!("ronnieJamesDio", "Ronnie_James_dio".to_case(Case::Camel));
        assert_eq!("ronnie_james_dio", "ronnieJamesDio".to_case(Case::Snake));

        assert_eq!("ronnieJamesDio", to_camel("Ronnie_James_dio"));
        assert_eq!("ronnie_james_dio", to_snake("ronnieJamesDio"));
    }

    #[bench]
    fn bench_to_camel1(b: &mut Bencher) {
        b.iter(|| "Ronnie_James_dio".to_case(Case::Camel));
    }

    #[bench]
    fn bench_to_camel2(b: &mut Bencher) {
        b.iter(|| to_camel("Ronnie_James_dio"));
    }

    #[bench]
    fn bench_to_snake1(b: &mut Bencher) {
        b.iter(|| "ronnieJamesDio".to_case(Case::Snake));
    }

    #[bench]
    fn bench_to_snake2(b: &mut Bencher) {
        b.iter(|| to_snake("ronnieJamesDio"));
    }
}
running 5 tests
test tests::it_works ... ignored
test tests::bench_to_camel1 ... bench:      22,035 ns/iter (+/- 7,051)
test tests::bench_to_camel2 ... bench:          85 ns/iter (+/- 27)
test tests::bench_to_snake1 ... bench:      19,016 ns/iter (+/- 1,645)
test tests::bench_to_snake2 ... bench:         226 ns/iter (+/- 43)

test result: ok. 0 passed; 0 failed; 1 ignored; 4 measured; 0 filtered out; finished in 13.33s