I'm using cgo to call a C function from Go. Inside the C function there is 
a callback to a Go function. In other way, I'm calling Go -> C -> Go.

After running pprof, I noticed that the __GI___pthread_mutex_unlock took 
half of the execution time. AFAIK, cgo has an overhead, especially calling 
back from C to Go. But it's weird that cgo takes half of the execution time 
to do some locking. Is there something wrong in my code?

Here is the gist containing the code 
https://gist.github.com/phqb/2fa5bc76b77208d7f36b151b405e6dcc.

pprof output:

```

(pprof) top
Showing nodes accounting for 136.20s, 89.12% of 152.82s total
Dropped 252 nodes (cum <= 0.76s)
Showing top 10 nodes out of 64
      flat  flat%   sum%        cum   cum%
    68.20s 44.63% 44.63%     68.20s 44.63%  __GI___pthread_mutex_unlock
    54.32s 35.55% 80.17%     54.32s 35.55%  __lll_lock_wait
     3.57s  2.34% 82.51%     57.89s 37.88%  __pthread_mutex_lock
     2.38s  1.56% 84.07%      3.15s  2.06%  runtime.casgstatus
     1.81s  1.18% 85.25%      1.81s  1.18%  runtime.futex
     1.26s  0.82% 86.08%      3.99s  2.61%  runtime.mallocgc
     1.21s  0.79% 86.87%      2.54s  1.66%  runtime.lock2
     1.21s  0.79% 87.66%      1.48s  0.97%  runtime.reentersyscall
     1.15s  0.75% 88.41%      1.15s  0.75%  runtime.procyield
     1.09s  0.71% 89.12%      1.59s  1.04%  runtime.exitsyscallfast

```

Running environment:

* Golang version: go version go1.20.5 linux/amd64

* `lscpu`:

```

Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   46 bits physical, 48 bits virtual
CPU(s):                          32
On-line CPU(s) list:             0-31
Thread(s) per core:              2
Core(s) per socket:              16
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           79
Model name:                      Intel(R) Xeon(R) CPU @ 2.20GHz
Stepping:                        0
CPU MHz:                         2200.152
BogoMIPS:                        4400.30
Hypervisor vendor:               KVM
Virtualization type:             full
L1d cache:                       512 KiB
L1i cache:                       512 KiB
L2 cache:                        4 MiB
L3 cache:                        55 MiB
NUMA node0 CPU(s):               0-31
...
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic 
sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx 
pdpe1gb rdtscp lm constant_tsc rep_good nopl xtop
                                 ology nonstop_tsc cpuid tsc_known_freq pni 
pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave 
avx f16c rdrand hypervisor lahf_lm abm 3dnowpre
                                 fetch invpcid_single pti ssbd ibrs ibpb 
stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed 
adx smap xsaveopt arat md_clear arch_capabilities

```

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/67687f95-af27-42a3-8e44-c3ecfc9f906dn%40googlegroups.com.

Reply via email to