The OpenNET Project / Index page

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



"Можн както ускорить вызо 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. Сообщение от ыы (?), 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

2. Сообщение от 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ообщить модератору
Родитель: #1 Ответы: #3

3. Сообщение от ыы (?), 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ообщить модератору
Родитель: #2 Ответы: #4

4. Сообщение от 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ообщить модератору
Родитель: #3 Ответы: #5

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #6

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

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

>Да и надо ли?

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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5 Ответы: #7

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

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

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

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

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

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


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

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

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


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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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