The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Можн както ускорить вызо C из Go?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Go)
Изначальное сообщение [ Отслеживать ]

"Можн както ускорить вызо C из Go?"  +1 +/
Сообщение от Bobik (?), 18-Фев-22, 22:50 
Пример надуманный но все же.

Rust:
rustc -C opt-level=3 -l static=num -L. main.rs
real    0m2.168s
user    0m2.163s
sys     0m0.005s

Go:
go build main.go
real    1m18.388s
user    1m18.342s
sys     0m0.092s


//num.c
int print_num(int num) {
    return num * 2;
}

//main.go
func main() {
        res := 0
        for i := 0; i < 1000_000_000; i++ {
                res = int(C.print_num(C.int(i)))
        }
        fmt.Println(res)
}

//main.rs
fn main() {
    let mut x: i32 = 0;
    for i in 0..1000_000_000 {
        unsafe {
            x = print_num(i);
        }
    }
    println!("{}", x);
}

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Можн както ускорить вызо C из Go?"  +/
Сообщение от ыы (?), 19-Фев-22, 15:43 
>[оверквотинг удален]
> fn main() {
>     let mut x: i32 = 0;
>     for i in 0..1000_000_000 {
>         unsafe {
>            
> x = print_num(i);
>         }
>     }
>     println!("{}", x);
> }

go build main.go
main.go:2:1: expected 'package', found 'func'


Ответить | Правка | Наверх | Cообщить модератору

2. "Можн както ускорить вызо C из Go?"  +/
Сообщение от Bobik (?), 19-Фев-22, 16:22 
>[оверквотинг удален]
>>     for i in 0..1000_000_000 {
>>         unsafe {
>>
>> x = print_num(i);
>>         }
>>     }
>>     println!("{}", x);
>> }
> go build main.go
> main.go:2:1: expected 'package', found 'func'

Это код на rust, он тут как "еталон" по скорости вызова c/c++ кода из других языков.

Ответить | Правка | Наверх | Cообщить модератору

3. "Можн както ускорить вызо C из Go?"  +/
Сообщение от ыы (?), 19-Фев-22, 18:44 
>[оверквотинг удален]
>>>
>>> x = print_num(i);
>>>         }
>>>     }
>>>     println!("{}", x);
>>> }
>> go build main.go
>> main.go:2:1: expected 'package', found 'func'
> Это код на rust, он тут как "еталон" по скорости вызова c/c++
> кода из других языков.

А это -
go build
процесс компиляции а не время рунтайма
вы сравниваете время компиляции?

Ответить | Правка | Наверх | Cообщить модератору

4. "Можн както ускорить вызо C из Go?"  +/
Сообщение от Bobik (?), 19-Фев-22, 20:25 
>[оверквотинг удален]
>>>>     println!("{}", x);
>>>> }
>>> go build main.go
>>> main.go:2:1: expected 'package', found 'func'
>> Это код на rust, он тут как "еталон" по скорости вызова c/c++
>> кода из других языков.
> А это -
> go build
> процесс компиляции а не время рунтайма
> вы сравниваете время компиляции?

Сравниваю время выполнения, "go build main.go" пример как компилировал, возможно есть флаги оптимизации которые ускорят. В интернете пишут что gccgo может собрать более быстрый бинарник но не в етом случае, у меня получилось в разы хуже.

Ответить | Правка | Наверх | Cообщить модератору

5. "Можн както ускорить вызо C из Go?"  +/
Сообщение от ыы (?), 19-Фев-22, 22:09 
>[оверквотинг удален]
>>> Это код на rust, он тут как "еталон" по скорости вызова c/c++
>>> кода из других языков.
>> А это -
>> go build
>> процесс компиляции а не время рунтайма
>> вы сравниваете время компиляции?
> Сравниваю время выполнения, "go build main.go" пример как компилировал, возможно есть флаги
> оптимизации которые ускорят. В интернете пишут что gccgo может собрать более
> быстрый бинарник но не в етом случае, у меня получилось в
> разы хуже.

Посмотрите на хабре статью по теме.
Есть технические причины почему вызов С функций из Go такой медленный. И похоже это не лечится. Да и надо ли?
Зачем инклюдить в исходник С-код?

Ответить | Правка | Наверх | Cообщить модератору

6. "Можн както ускорить вызо C из Go?"  +/
Сообщение от Bobik (?), 20-Фев-22, 00:55 
> Посмотрите на хабре статью по теме.
> Есть технические причины почему вызов С функций из Go такой медленный. И
> похоже это не лечится.

В целом понятно почему так медленно, думал может кто подскажет как ускорить.

>Да и надо ли?

Былобы не плохо, например для использования rocksdb

> Зачем инклюдить в исходник С-код?

Тут мне сложно ответить так как я не понял вопрос, просто выше опущены некоторые моменты по компиляции и линковке.

С-код компилируется gcc в обектный файл а потом линкуется
с скомпилированым кодом go или rust. Инклудов там никаких нет, можно было слинковать уже с существующей в системе библиотекой, но мне так проще было сделать.

Ответить | Правка | Наверх | Cообщить модератору

7. "Можн както ускорить вызо C из Go?"  +/
Сообщение от Брат Анон (ok), 07-Ноя-22, 12:34 
> В целом понятно почему так медленно, думал может кто подскажет как ускорить.

Нет, это никак не ускоряется. Вызовы в Си чудовищно дорогие. Меньше дёргайте Си.

> Былобы не плохо, например для использования rocksdb

Передавайте жирные блобы.

>> Зачем инклюдить в исходник С-код?
> Тут мне сложно ответить так как я не понял вопрос, просто выше
> опущены некоторые моменты по компиляции и линковке.

Вы не поняли вопроса. Зачем вам в Го -- Си? Вы ломаете безопасность типов и инварианты памяти.


> С-код компилируется gcc в обектный файл а потом линкуется
> с скомпилированым кодом go или rust. Инклудов там никаких нет, можно было
> слинковать уже с существующей в системе библиотекой, но мне так проще
> было сделать.

Вопрос не про линковку. Вопрос про то, что Си для Го -- совершенно неродной.
Вы пытаетесь есть суп вилкой.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру