• Как удалить таблицу из базы postgresql, подставляя имя из переменной?

    @TicSo Автор вопроса
    По имени таблицы понятно.
    У меня не получается через параметр передать: имя поля и тип поля.
    Вот так не работает:
    let _ = &client.query("CREATE TABLE IF NOT EXISTS public.test_01 ($1 $2, CONSTRAINT test_01_pkey PRIMARY KEY ($3))", &[&name_column[0], &column_datatype[0], &name_column[0]]).await?;

    и так:
    let _ = &client.query("CREATE TABLE IF NOT EXISTS public.test_01 ($1::TEXT smallserial, CONSTRAINT test_01_pkey PRIMARY KEY (id_test_01))", &[&"id_test_01"]).await?;
    Написано
  • Как удалить таблицу из базы postgresql, подставляя имя из переменной?

    @TicSo Автор вопроса
    Ivan Ustûžanin, понятно .. спасибо
    по Вашей рекомендации так работает:
    let x: &str = &("DROP TABLE IF EXISTS".to_string() + " " + &name_schema_tb);
       let _ = &client.query(x, &[]).await?;
    Написано
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    @TicSo Автор вопроса
    Василий Банников, так я на трёхстах повторениях и получил расхождение большое, о чем исходный вопрос и задал ...
    Написано
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    @TicSo Автор вопроса
    Тогда я неправильно измеряю время каждого повторения, т.е. внешней итерации вот этого всего цикла:
    внешний цикл
    loop {
          if j == RING {break};
          let start = Instant::now();
          //
          loop {
             if i == len_01 {break};
             if vec_01[i] % 2 == 0 {
                vec_chet.push(vec_01[i]);
                count_chet = count_chet + 1;
             }else{
                vec_nech.push(vec_01[i]);
                count_nech = count_nech + 1;
             }
             i = i + 1;
          }
          //
          i = 0;
       //
       j = j + 1;
       let duration = start.elapsed();
       // println!("{:?}. время выполнения цикла = {:?} наносек. = {:?}", j, duration, duration.subsec_nanos() as u64);
       //
       if (duration.subsec_nanos() as u64) > t01 {
          t01 = duration.subsec_nanos() as u64;
       }
       if (duration.subsec_nanos() as u64) < t02 {
          t02 = duration.subsec_nanos() as u64;
       }
       //
       }

    Потому что здесь:
    println!("{:?}. время выполнения цикла = {:?} наносек. = {:?}", j, duration, duration.subsec_nanos() as u64);

    совпадает `duration` и `duration.subsec_nanos() as u64`
    например

    Это можно видеть и в текущем коде, например, на 10 элементов массива и 8 повторений:
    vec_01 = [153, 50, 214, 252, 196, 17, 123, 20, 64, 146]
    1. время выполнения цикла = 1.5µs наносек. = 1500
    2. время выполнения цикла = 1.9µs наносек. = 1900
    3. время выполнения цикла = 1µs наносек. = 1000
    4. время выполнения цикла = 1µs наносек. = 1000
    5. время выполнения цикла = 900ns наносек. = 900
    6. время выполнения цикла = 900ns наносек. = 900
    7. время выполнения цикла = 900ns наносек. = 900
    8. время выполнения цикла = 900ns наносек. = 900
    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 10
    кол-во повторов = 8
    count_chet = 56
    count_nech = 24
    time_min = 900 time_max = 1900

    Массив на 1000 элементов 30 повторений тоже считает правильно,
    второй цикл из 30 дал минимальное время и 24-й цикл - максимальное:
    30 на 1000

    1. время выполнения цикла = 31.8µs наносек. = 31800
    2. время выполнения цикла = 31.6µs наносек. = 31600
    3. время выполнения цикла = 31.7µs наносек. = 31700
    4. время выполнения цикла = 33.3µs наносек. = 33300
    5. время выполнения цикла = 44.2µs наносек. = 44200
    6. время выполнения цикла = 43.9µs наносек. = 43900
    7. время выполнения цикла = 44.5µs наносек. = 44500
    8. время выполнения цикла = 42.7µs наносек. = 42700
    9. время выполнения цикла = 42.5µs наносек. = 42500
    10. время выполнения цикла = 42.5µs наносек. = 42500
    11. время выполнения цикла = 43.1µs наносек. = 43100
    12. время выполнения цикла = 42.5µs наносек. = 42500
    13. время выполнения цикла = 33.5µs наносек. = 33500
    14. время выполнения цикла = 42.9µs наносек. = 42900
    15. время выполнения цикла = 33.2µs наносек. = 33200
    16. время выполнения цикла = 34µs наносек. = 34000
    17. время выполнения цикла = 32.1µs наносек. = 32100
    18. время выполнения цикла = 33.2µs наносек. = 33200
    19. время выполнения цикла = 33.4µs наносек. = 33400
    20. время выполнения цикла = 32.6µs наносек. = 32600
    21. время выполнения цикла = 31.6µs наносек. = 31600
    22. время выполнения цикла = 33.2µs наносек. = 33200
    23. время выполнения цикла = 43.4µs наносек. = 43400
    24. время выполнения цикла = 50.5µs наносек. = 50500
    25. время выполнения цикла = 32.7µs наносек. = 32700
    26. время выполнения цикла = 31.6µs наносек. = 31600
    27. время выполнения цикла = 32.1µs наносек. = 32100
    28. время выполнения цикла = 33.6µs наносек. = 33600
    29. время выполнения цикла = 33.1µs наносек. = 33100
    30. время выполнения цикла = 35.9µs наносек. = 35900
    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 1000
    кол-во повторов = 30
    count_chet = 15210
    count_nech = 14790

    time_min = 31600 time_max = 50500
    Написано
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    @TicSo Автор вопроса
    Василий Банников,
    1. Бенчмаркать нужно на одном и том же наборе данных.
    В примере кода делаю 300 повторений над одним и тем же набором данных.
    Написано
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    @TicSo Автор вопроса
    Например, если вектор на 100к элементов:
    статистика

    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 100000
    кол-во повторов = 300
    count_chet = 14976300
    count_nech = 15023700
    time_min = 2955500 time_max = 8525500

    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 100000
    кол-во повторов = 300
    count_chet = 15050100
    count_nech = 14949900
    time_min = 2956200 time_max = 8764100

    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 100000
    кол-во повторов = 300
    count_chet = 14978700
    count_nech = 15021300
    time_min = 2957000 time_max = 7772900

    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 100000
    кол-во повторов = 300
    count_chet = 15069600
    count_nech = 14930400
    time_min = 2960400 time_max = 8574400

    кол-во элементов массива `vec_01`, которые обрабатываю в цикле = 100000
    кол-во повторов = 300
    count_chet = 15016500
    count_nech = 14983500
    time_min = 2958300 time_max = 7579600
    Написано
  • Как реализована и хранится связь между именем переменной и ссылкой?

    @TicSo Автор вопроса
    Василий Банников, для переменной `s1`, c типом данных String из примера, в стеке лежит:
    1. указатель на кучу: 0x56149d7a69b0
    2. len = 3
    3. cap =3
    это лежит в стеке по адресу ссылки: 0x7ffc7b7e8068
    Так?

    Например, образно для Stack:
    0x7ffc7b7e8068 - 0x56149d7a69b0
    0x7ffc7b7e8069 - 3
    0x7ffc7b7e8070 - 3

    Например, для Heap:
    0x56149d7a69b0 - a
    0x56149d7a69b1 - b
    0x56149d7a69b2 - c

    Вместо символов - числа u8.
    Написано
  • Как реализована и хранится связь между именем переменной и ссылкой?

    @TicSo Автор вопроса
    Василий Банников, понял, спасибо.

    По имени переменной `s1` получаю ссылку: 0x7ffc7b7e8068.
    Это адрес ячейки стека, в которой расположен указатель на кучу: 0x56149d7a69b0.
    По адресу ячейки в куче: 0x7ffc7b7e8068 расположен первый элемент строки `s1`.
    По метаданным стека `len` и `cap` - получаю из кучи всё значение переменной `s1`.
    Если в переменную `s1` вношу новые данные превышающие прежние `len` и `cap`
    и старое место в куче не позволяет расшириться, то данные пишутся
    в новой её области и при этом меняются только:
    - метаданные в стеке;
    - указатель на кучу: 0x56149d7a69b0 (только при новой области кучи).

    Где я ошибаюсь и какова роль `ссылки на указатель`: 0x7ffee168cf88.
    Написано
  • Как реализована и хранится связь между именем переменной и ссылкой?

    @TicSo Автор вопроса
    Сергей Горностаев, понял, спасибо. Тип данных созданной переменной также отдельно не хранится и в рантайме не контролируется, исключена такая потребность?
    Написано
  • Как пояснить работу с типом &str?

    @TicSo Автор вопроса
    Исходя из отмеченного решением,
    конкатенация в одну строку кода,
    если все слагаемые типа &str:
    fn main() {
        
        let s: &str = "x";
        println!("1. {:?}", s);     // "x"
        println!("1. {:p}\n", &s);  // 0x7ffd82dd8b70
    
        // вариант 2.1 не даёт пересоздать:
        // let s: &str = (s.to_string() + "y" + "z").as_str();
        //
        // вариант 2.2 даёт пересоздать: 
        let s: &str = &(s.to_string() + "y" + "z");
        //
        println!("2. {:?}", s);    // "xyz"
        println!("2. {:p}", &s);   // 0x7ffd82dd8c28
    }
    Написано
  • Как пояснить работу с типом &str?

    @TicSo Автор вопроса
    Василий Банников,
    В примерах 2.1 и 2.2 ты дропаешь этот String

    дропаю соответственно этим: `as_str()` и `&` ?
    Понятно.
    Тогда промежуточная переменная - это обязательное, в моём случае, условие?
    Спасибо.
    Написано
  • Как пояснить работу с типом &str?

    @TicSo Автор вопроса
    Спасибо за помощь.

    Я поправил код, чтобы уточнить, что второй вариант - это два отдельных и равнозначных выражения, которые у меня не работают. Разделил их на 2.1 и 2.2.

    Понимаю, что для конкатенации нужна конструкция: String + &str

    Если переменная s будет исходно типом данных String, то промежуточная переменная b не нужна. Вот спрашиваю теорию, почему для моего случая,
    когда переменная s задана типом &str, - не могу обойтись без промежуточной
    переменной. Т.е. в чём причина, по разному передаются в функцию переменные из стека (клонирует) и кучи?
    Написано
  • Как установить plrust под windows для создания функций в pgAdmin?

    @TicSo Автор вопроса
    Спасибо за ответ,
    возможно что не получится

    не получилось ..
    Написано
  • Как исправить код конвертации vec_u8 to vec_&str?

    @TicSo Автор вопроса
    Дмитрий Беляев, спасибо

    важна скорость чего?

    1. получить вектор символов из исходного байт-вектора

    2. также, чтобы результат лежал не в heap

    кроме того, думал, что можно иначе, как через from_utf8() и далее циклом.
  • Как исправить код конвертации vec_u8 to vec_&str?

    @TicSo Автор вопроса
    Дмитрий Беляев,
    для понимания, - почему блок A работает, а B - нет:

    код

    // блок A
    let mut u02: Vec<String> = vec![];
    for c in u01_str.chars() {
       u02.push(c.to_string());
    }
    println!("3. u02 = {:?}", &u02);         //  [";", "\r", "\n", " ", "/", "*"]
    
    //  блок B
    let mut u03: Vec<&str> = vec![];
    for c in u01_str.chars() {
       u03.push(c.to_string().as_str());
    }
    println!("4. u03 = {:?}", &u03);         // чтобы получить: [";", "\r", "\n", " ", "/", "*"]


    также уточнить, правильно ли я делаю, если важна скорость и нужно конвертировать из Vec_u8 в Vec_String.
  • Как исправить код конвертации vec_u8 to vec_&str?

    @TicSo Автор вопроса
    Дмитрий Беляев, спасибо, как правильно сделать?