1. C/C++
  2. Golang

Golang协程 VS C++

一.Golang

//统计二十万以内的素数
package main

import (
	"fmt"
	"time"
)

var (
	intChan   chan int
	primeChan chan int
	exitChan  chan bool
)

func isPrime(i int) bool {
	for j := 2; j < i; j++ {
		if i%j == 0 {
			return false
		}
	}
	return true
}
func primeNum() {
	for {
		v, ok := <-intChan
		if !ok { //如果读不出数据
			break
		}
		if isPrime(v) {
			primeChan <- v
		}
	}
	fmt.Println("一个协程完成工作!")
	//置一个退出标志
	exitChan <- true
}
func putNum() {
	for i := 1; i <= 200000; i++ {
		intChan <- i
	}
	close(intChan)
}
func main() {
	intChan = make(chan int, 1000)
	primeChan = make(chan int, 100000)
	exitChan = make(chan bool, 6)
	start := time.Now().Unix()
	//开启协程向 intChan 放数据
	go putNum()

	//开启六个个判断素数协程
	for i := 0; i < 6; i++ {
		go primeNum()
	}

	//主进程结束判断
	go func() {
		for i := 0; i < 6; i++ {
			<-exitChan
		}

		end := time.Now().Unix()
		fmt.Printf("total time used: %v s\n", end-start)

		close(primeChan)
	}()

	//读出结果
	for {
		_, ok := <-primeChan
		if !ok {
			break
		}
		//fmt.Println(res)
	}
	fmt.Println("主线程退出")
}
一个协程完成工作!
一个协程完成工作!
一个协程完成工作!
一个协程完成工作!
一个协程完成工作!
一个协程完成工作!
total time used: 2 s
主线程退出
Process exiting with code: 0

二.C++


#include <cstdio>
#include <queue>
#include<time.h>

bool isPrime(int i)
{
	for (int j = 2; j < i; j++)
	{
		if (i % j == 0)
			return false;
	}
	return true;
}
int main()
{
	clock_t start, finish;
	double totaltime;
	start = clock();
	std::queue<int> q;
	for (int i = 2; i < 200000; i++)
	{
		if (isPrime(i))
		{
			q.push(i);
			//printf("%d\n", i);
		}
	}
	finish = clock();
	totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("total time used: %lf s", totaltime);
	return 0;
}
total time used: 5.007000 s

总结:CPP还是厉害啊!