LINUX.ORG.RU

История изменений

Исправление LightDiver, (текущая версия) :

Ну да, раст полностью разворачивает цикл, как выше вон предложили. Нет проверок границ, константы зашивает, работает через временное хранилще, оптимизирует выход. Интересное. Вот только использует стек для хранения загрузки, а это медленее чуть чуть, чем напрмую.

Может немного удивлю, хотя врядли. Попробуй такой «бенчарк».

use std::process::exit;

const ITERS: usize = 1_000_000_000;
const ARR: [i64; 5] = [4, 9, 3, 8, 4];
const VAL: i64 = 9;
const LEN: usize = 5;
const EXIT_FAILURE: i32 = 0;
const EXIT_SUCCESS: i32 = 1;

fn main() {
    let mut found = EXIT_FAILURE;
    
    for _ in 0..ITERS {
        found = EXIT_FAILURE;
        let mut i = LEN;
        while i > 0 {
            i -= 1;
            if ARR[i] == VAL {
                found = EXIT_SUCCESS;
                break;
            }
        }
    }
    
    exit(found);
}

Исправление LightDiver, :

Может немного удивлю, хотя врядли. Попробуй такой «бенчарк».

use std::process::exit;

const ITERS: usize = 1_000_000_000;
const ARR: [i64; 5] = [4, 9, 3, 8, 4];
const VAL: i64 = 9;
const LEN: usize = 5;
const EXIT_FAILURE: i32 = 0;
const EXIT_SUCCESS: i32 = 1;

fn main() {
    let mut found = EXIT_FAILURE;
    
    for _ in 0..ITERS {
        found = EXIT_FAILURE;
        let mut i = LEN;
        while i > 0 {
            i -= 1;
            if ARR[i] == VAL {
                found = EXIT_SUCCESS;
                break;
            }
        }
    }
    
    exit(found);
}

Исходная версия LightDiver, :

Ну да, раст полностью разворачивает цикл, как выше вон предложили. Нет проверок границ, константы зашивает, работает через временное хранилще, оптимизирует выход. Интересное. Вот только использует стек для хранения загрузки, а это медленее чуть чуть, чем напрмую.