summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-02-16 22:00:24 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-02-16 22:00:24 +0400
commit5676f765746768da70f721fe116dfabfbb2b3b94 (patch)
tree44baf3da49e33e71c270c1b9682ea0288493d684
parentad8ba9184d4c3b6eff9d251a8677853075975fce (diff)
Добавлено сравнение с библиотекой rug
-rw-r--r--sem2/Cargo.lock28
-rw-r--r--sem2/Cargo.toml1
-rw-r--r--sem2/src/main.rs54
3 files changed, 73 insertions, 10 deletions
diff --git a/sem2/Cargo.lock b/sem2/Cargo.lock
index 50ba357..ba4505a 100644
--- a/sem2/Cargo.lock
+++ b/sem2/Cargo.lock
@@ -9,6 +9,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
+name = "az"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
+
+[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -52,6 +58,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9b0705efd4599c15a38151f4721f7bc388306f61084d3bfd50bd07fbca5cb60"
[[package]]
+name = "gmp-mpfr-sys"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "751710e4e568a3057987c7dc5bf85aab59b9a306a014a1900e52bbe427bc0cf6"
+dependencies = [
+ "libc",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
name = "inquire"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -170,6 +186,17 @@ dependencies = [
]
[[package]]
+name = "rug"
+version = "1.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a465f6576b9f0844bd35749197576d68e3db169120532c4e0f868ecccad3d449"
+dependencies = [
+ "az",
+ "gmp-mpfr-sys",
+ "libc",
+]
+
+[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -180,6 +207,7 @@ name = "sem2"
version = "0.1.0"
dependencies = [
"inquire",
+ "rug",
]
[[package]]
diff --git a/sem2/Cargo.toml b/sem2/Cargo.toml
index cc91b0e..aee29a2 100644
--- a/sem2/Cargo.toml
+++ b/sem2/Cargo.toml
@@ -7,3 +7,4 @@ edition = "2021"
[dependencies]
inquire = "0.5.3"
+rug = "1.17"
diff --git a/sem2/src/main.rs b/sem2/src/main.rs
index ed33b43..34a346f 100644
--- a/sem2/src/main.rs
+++ b/sem2/src/main.rs
@@ -1,4 +1,6 @@
use inquire::Text;
+use rug::{Complete, Integer};
+use std::time::Instant;
mod mpn;
fn main() {
@@ -7,7 +9,7 @@ fn main() {
Ok(text) => text,
Err(_) => return,
};
- let radix = match radix.parse::<usize>() {
+ let radix = match radix.parse::<i32>() {
Ok(number) => number,
Err(_) => {
println!("Основание должно быть десятичным числом");
@@ -15,23 +17,23 @@ fn main() {
}
};
- let a = match Text::new("Введите число:").prompt() {
+ let a_text = match Text::new("Введите число:").prompt() {
Ok(text) => text,
Err(_) => return,
};
- let a = match mpn::Number::parse(&a, radix) {
+ let b_text = match Text::new("Введите число:").prompt() {
+ Ok(text) => text,
+ Err(_) => return,
+ };
+
+ let a = match mpn::Number::parse(&a_text, radix as usize) {
Ok(number) => number,
Err(what) => {
println!("{what}");
return;
}
};
-
- let b = match Text::new("Введите число:").prompt() {
- Ok(text) => text,
- Err(_) => return,
- };
- let b = match mpn::Number::parse(&b, radix) {
+ let b = match mpn::Number::parse(&b_text, radix as usize) {
Ok(number) => number,
Err(what) => {
println!("{what}");
@@ -39,5 +41,37 @@ fn main() {
}
};
- println!("Сумма: {}", a + b);
+ let a_rug = match Integer::parse_radix(a_text, radix) {
+ Ok(parsed) => parsed.complete(),
+ Err(_) => {
+ println!("Не удалось считать число");
+ return;
+ }
+ };
+ let b_rug = match Integer::parse_radix(b_text, radix) {
+ Ok(parsed) => parsed.complete(),
+ Err(_) => {
+ println!("Не удалось считать число");
+ return;
+ }
+ };
+
+ let mpn_sum_start = Instant::now();
+ let mpn_sum = a + b;
+ let mpn_sum_elapsed = mpn_sum_start.elapsed();
+
+ let rug_sum_start = Instant::now();
+ let _rug_sum = a_rug + b_rug;
+ let rug_sum_elapsed = rug_sum_start.elapsed();
+
+ println!("Сумма: {}", mpn_sum);
+
+ println!(
+ "Операция суммы выполнена в mpn за {} наносекунд",
+ mpn_sum_elapsed.as_nanos()
+ );
+ println!(
+ "Операция суммы выполнена в rug за {} наносекунд",
+ rug_sum_elapsed.as_nanos()
+ );
}