日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

asm 比 ucontext 快

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asm 比 ucontext 快 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

測(cè)試原裝libco的asm版 ?與 ?libco的ucontext版性能, 同一個(gè)機(jī)器、同一份代碼, 連接不同的libco實(shí)現(xiàn)庫(kù)。 ?asm版比ucontext快6倍左右。

但是有網(wǎng)友說(shuō):

但是1秒切換100萬(wàn)次的應(yīng)用不多,更多消耗在共享?xiàng)?截?br />

更多消耗在設(shè)置高低電平


libco這種只能是半雙工一應(yīng)一答式, 用udp, 短連接tcp, 或者長(zhǎng)連接tcp半雙工模式。


長(zhǎng)連接的全雙工不行, fastrpc底層的協(xié)程庫(kù)是長(zhǎng)連接全雙工模式。


半雙工時(shí), 多開(kāi)連接數(shù)可以提高性能,但也不是越多越好。



#include "co_routine.h"

#include <sys/time.h>
#include <stdio.h>



struct Ctx
{
? ? stCoRoutine_t *pCo;
};


int cocount = 2;
int testcount = 1000000;
Ctx *arrayTask = NULL;
int testi = 0;


#define LOGD(x, ...) (x, ##__VA_ARGS__)
#define LOGI(x, ...) printf(x, ##__VA_ARGS__)




void *func1(void *p)
{
? ? co_enable_hook_sys();
? ? while(1)
? ? {
? ? ? ? LOGD("func1 %d start\n", testi);
? ? ? ? co_yield_ct();
? ? ? ? LOGD("func1 %d end\n", testi);


? ? ? ? if(testi == testcount) break;
? ? }


? ? LOGD("func1 end...\n");
}


void *func0(void *p)
{
? ? timeval beg,end;
? ? co_enable_hook_sys();


? ? LOGD("func0 poll start\n");

? ? poll(0,0,1000);

? ??LOGD("func0 poll end\n");


? ? gettimeofday(&beg, NULL);
? ? for(; testi < testcount; testi++)
? ? {
? ? ? ? LOGD("func0 %d start\n", testi);
? ? ? ? co_resume(arrayTask[1].pCo);
? ? ? ? LOGD("func0 %d end\n", testi);
? ? }
? ? co_resume(arrayTask[1].pCo);
? ? gettimeofday(&end, NULL);
? ? LOGI("switch %d times, cost: %d(us)\n", testcount, 1000000*(end.tv_sec-beg.tv_sec) + end.tv_usec-beg.tv_usec);


? ? LOGD("func0 end...\n");
}


void run()
{
? ? arrayTask = new Ctx[cocount];


// ? ?co_enable_hook_sys();
? ? co_create(&arrayTask[0].pCo, NULL, func0, &arrayTask[0]);
? ? co_resume(arrayTask[0].pCo);
? ? co_create(&arrayTask[1].pCo, NULL, func1, &arrayTask[1]);
? ? co_resume(arrayTask[1].pCo);


? ? co_eventloop(co_get_epoll_ct(), 0, 0);
? ? LOGD("end of run...\n");
}


int main(int, char *[])
{
? ? run();
? ? return 0;
}

總結(jié)

以上是生活随笔為你收集整理的asm 比 ucontext 快的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。