小编Dan*_*yla的帖子

为什么多核上的goroutine分配速度较慢?

我在Go做了一些实验,我发现了一些非常奇怪的东西.当我在计算机上运行以下代码时,它会在约0.5秒内执行.

package main

import (
  "fmt"
  "runtime"
  "time"
)
func waitAround(die chan bool) {
  <- die
}
func main() {
  var startMemory runtime.MemStats
  runtime.ReadMemStats(&startMemory)

  start := time.Now()
  cpus := runtime.NumCPU()
  runtime.GOMAXPROCS(cpus)
  die := make(chan bool)
  count := 100000
  for i := 0; i < count; i++ {
    go waitAround(die)
  }
  elapsed := time.Since(start)

  var endMemory runtime.MemStats
  runtime.ReadMemStats(&endMemory)

  fmt.Printf("Started %d goroutines\n%d CPUs\n%f seconds\n",
    count, cpus, elapsed.Seconds())
  fmt.Printf("Memory before %d\nmemory after %d\n", startMemory.Alloc,
    endMemory.Alloc)
  fmt.Printf("%d goroutines running\n", runtime.NumGoroutine())
  fmt.Printf("%d bytes per goroutine\n", …
Run Code Online (Sandbox Code Playgroud)

multithreading go

4
推荐指数
1
解决办法
255
查看次数

什么时候在c中释放内存?

我试图找出用于c中的变量的内存何时被释放.举个例子,什么时候i在下面的代码片段中释放整数?

int function()
{
  int i = 1;
  // do some things
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c memory-management

4
推荐指数
2
解决办法
2144
查看次数

'reverse_string'函数的冲突类型

我正在使用这个SO问题作为需要反转字符串的程序的一部分.我遇到的问题是我似乎无法使功能发挥作用.这是我的代码:

int main(int argc, char *argv[]){
  char *test = "Testing";
  fputs(test, stdout);
  fputs(reverse_string(test), stdout);
}

char* reverse_string(char *str){
  char temp;
  size_t len = strlen(str) - 1;
  size_t i;
  size_t k = len;
  for(i = 0; i < (len +1)/2; i++){
    temp = str[k];
    str[k] = str[i];
    str[i] = temp;
    k--;
  }  
  return str;
}
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误 conflicting types for 'reverse_string'

编辑:对于任何想知道这里的人来说,代码是有效的.请参阅@ chux的答案以获得解释.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char* reverse_string(char *str){
  char temp;
  size_t len = strlen(str) - 1; …
Run Code Online (Sandbox Code Playgroud)

c string

3
推荐指数
1
解决办法
719
查看次数

goroutines造成重大减速和头痛

我遇到了goroutines的问题.为什么这段代码在~125ms内执行(注意顺序执行):

package main

import (
  "os/exec"
  "time"
  "fmt"
)

func main() {
  cmd := exec.Command("lessc", "--yui-compress", "test.less")
  n := 2000
  start := time.Now()
  for i := 0; i < n; i++ {
    cmd.Run()
  }
  finish := time.Now()

  fmt.Printf("Program took %v to run\n", finish.Sub(start))
}
Run Code Online (Sandbox Code Playgroud)

当此代码大约需要20秒时(使用goroutines并发执行):

package main

import (
  "os/exec"
  "time"
  "fmt"
)

func main() {
  cmd := exec.Command("lessc", "--yui-compress", "test.less")
  ch := make(chan bool)
  n := 2000
  start := time.Now()
  for i := 0; i < n; i++ { …
Run Code Online (Sandbox Code Playgroud)

concurrency go goroutine

1
推荐指数
1
解决办法
175
查看次数