Пример надуманный но все же.Rust:
rustc -C opt-level=3 -l static=num -L. main.rs
real 0m2.168s
user 0m2.163s
sys 0m0.005sGo:
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);
}
>[оверквотинг удален]
> 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'
>[оверквотинг удален]
>> 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++ кода из других языков.
>[оверквотинг удален]
>>>
>>> x = print_num(i);
>>> }
>>> }
>>> println!("{}", x);
>>> }
>> go build main.go
>> main.go:2:1: expected 'package', found 'func'
> Это код на rust, он тут как "еталон" по скорости вызова c/c++
> кода из других языков.А это -
go build
процесс компиляции а не время рунтайма
вы сравниваете время компиляции?
>[оверквотинг удален]
>>>> println!("{}", x);
>>>> }
>>> go build main.go
>>> main.go:2:1: expected 'package', found 'func'
>> Это код на rust, он тут как "еталон" по скорости вызова c/c++
>> кода из других языков.
> А это -
> go build
> процесс компиляции а не время рунтайма
> вы сравниваете время компиляции?Сравниваю время выполнения, "go build main.go" пример как компилировал, возможно есть флаги оптимизации которые ускорят. В интернете пишут что gccgo может собрать более быстрый бинарник но не в етом случае, у меня получилось в разы хуже.
>[оверквотинг удален]
>>> Это код на rust, он тут как "еталон" по скорости вызова c/c++
>>> кода из других языков.
>> А это -
>> go build
>> процесс компиляции а не время рунтайма
>> вы сравниваете время компиляции?
> Сравниваю время выполнения, "go build main.go" пример как компилировал, возможно есть флаги
> оптимизации которые ускорят. В интернете пишут что gccgo может собрать более
> быстрый бинарник но не в етом случае, у меня получилось в
> разы хуже.Посмотрите на хабре статью по теме.
Есть технические причины почему вызов С функций из Go такой медленный. И похоже это не лечится. Да и надо ли?
Зачем инклюдить в исходник С-код?
> Посмотрите на хабре статью по теме.
> Есть технические причины почему вызов С функций из Go такой медленный. И
> похоже это не лечится.В целом понятно почему так медленно, думал может кто подскажет как ускорить.
>Да и надо ли?
Былобы не плохо, например для использования rocksdb
> Зачем инклюдить в исходник С-код?
Тут мне сложно ответить так как я не понял вопрос, просто выше опущены некоторые моменты по компиляции и линковке.
С-код компилируется gcc в обектный файл а потом линкуется
с скомпилированым кодом go или rust. Инклудов там никаких нет, можно было слинковать уже с существующей в системе библиотекой, но мне так проще было сделать.
> В целом понятно почему так медленно, думал может кто подскажет как ускорить.Нет, это никак не ускоряется. Вызовы в Си чудовищно дорогие. Меньше дёргайте Си.
> Былобы не плохо, например для использования rocksdb
Передавайте жирные блобы.
>> Зачем инклюдить в исходник С-код?
> Тут мне сложно ответить так как я не понял вопрос, просто выше
> опущены некоторые моменты по компиляции и линковке.Вы не поняли вопроса. Зачем вам в Го -- Си? Вы ломаете безопасность типов и инварианты памяти.
> С-код компилируется gcc в обектный файл а потом линкуется
> с скомпилированым кодом go или rust. Инклудов там никаких нет, можно было
> слинковать уже с существующей в системе библиотекой, но мне так проще
> было сделать.Вопрос не про линковку. Вопрос про то, что Си для Го -- совершенно неродной.
Вы пытаетесь есть суп вилкой.