2020-05-28PHP實(shí)現(xiàn)的異步框架Workerman和模板技術(shù)
2021-02-02
WEB開(kāi)發(fā)框架性能排名和趨勢(shì)分析2-三項(xiàng)意外更改
Web框架性能排名
根據(jù)TechEmpower的“”性能基準(zhǔn)測(cè)試進(jìn)行的最新解釋后,Round19(2020-05-28)列表在兩年后發(fā)生了三個(gè)令人振奮的變化:
注意:帶星號(hào)的項(xiàng)目支持完整的ORM和模板技術(shù)
一、神奇的鋰電
C ++和Rust都僅提供編譯時(shí)反射,因此有兩種方法可以實(shí)現(xiàn)ORM。一種是帶有生成器的生成器,它需要工具和預(yù)處理。一種是使用宏和模板技術(shù)來(lái)生成代碼。
鋰項(xiàng)目不同于其他風(fēng)騷的混蛋。該代碼是如此優(yōu)雅和凌亂,并且性能驚人。鋰(ORM)(RAW)已達(dá)到59.2%。盡管使用宏和模板有點(diǎn)乏味,但仍然值得一看。
與Rust的柴油相比php開(kāi)發(fā)框架 排名,僅獲得了24%的結(jié)果,還有很大的改進(jìn)空間。 Golang的框架測(cè)試代碼都沒(méi)有ORM,因?yàn)镚olang的反射機(jī)制仍然很慢,直接影響性能。
auto fortunes = sql_orm_schema(sql_db, "Fortune").fields( s::id(s::auto_increment, s::primary_key) = int(), s::message = std::string()); my_api.get("/fortunes") = [&](http_request& request, http_response& response) { sql_db.max_async_connections_per_thread_ = fortunes_nconn; typedef decltype(fortunes.all_fields()) fortune; std::vectortable; { auto c = fortunes.connect(request.fiber); c.forall([&] (const auto& f) { table.emplace_back(metamap_clone(f)); }); } table.emplace_back(0, "Additional fortune added at request time."); std::sort(table.begin(), table.end(), [] (const fortune& a, const fortune& b) { return a.message < b.message; }); li::growing_output_buffer ss; ss << " Fortunes "; response.set_header("Content-Type", "text/html; charset=utf-8"); response.write(ss.to_string_view()); };
"; for(auto& f : table) { ss << " id message "; } ss << " " << f.id << " "; escape_html_entities(ss, f.message); ss << "
二、可怕的工人
PHP一直熱衷于使用低級(jí)代碼來(lái)提高性能,但是由于各種原因,結(jié)果有限。盡管異步PHP框架的出現(xiàn)完全放棄了PHP的基本機(jī)制,從而極大地提高了性能并且沒(méi)有引起重大變化,但純PHP實(shí)現(xiàn)的異步框架Workerman可能會(huì)改變這種情況。使用Workerman的Ubiquity框架,它擊敗了許多框架并獲得了第二名。性能已經(jīng)提高了數(shù)十倍,這真是可怕。事實(shí)證明,PHP足夠好,但是打開(kāi)它的方法是錯(cuò)誤的。
Act(ORM)(節(jié)奏):28.9%
普遍性(ORM)(PHP):28.1%
Actix(柴油)(HBS):23.6%
AspCore(EF)(ASP):23.3%
class Fortunes extends \Ubiquity\controllers\SimpleViewController { public function initialize() { \Ubiquity\cache\CacheManager::startProdFromCtrl(); } public function index() { $fortunes = SDAO::getAll(Fortune::class); $fortunes[] = new Fortune(0, 'Additional fortune added at request time.'); \usort($fortunes, function ($left, $right) { return $left->message <=> $right->message; }); $this->loadView('Fortunes/index.php', [ 'fortunes' => $fortunes ]); } }
三、意外的羅達(dá)
因?yàn)镴avaScript使用Node.js的異步機(jī)制,所以JS框架的亮相是巔峰之作,其他腳本語(yǔ)言只能追趕。這次PHP進(jìn)行了一次周轉(zhuǎn),讓JavaScript領(lǐng)先,并突然落后了一步。
Ruby陣營(yíng)的變化也使Ruby比JavaScript具有更多的優(yōu)勢(shì)。 Roda的性能已在Python的基礎(chǔ)上翻了一番。在沒(méi)有完全使用異步體系結(jié)構(gòu)的情況下就是這種情況。php開(kāi)發(fā)框架 排名,人們不禁期待。
腳本開(kāi)發(fā)的性能排名將從JavaScript> Ruby> Python >>>>>>>>> PHP更改為PHP >>> Ruby> JavaScript> Python。 Python也從感覺(jué)良好轉(zhuǎn)變?yōu)闆](méi)有存在感的卑鄙行為。
static_get '/fortunes' do |_| @fortunes = Fortune.all @fortunes << Fortune.new( :id=>0, :message=>'Additional fortune added at request time.' ) @fortunes.sort_by!(&:message) view :fortunes end
時(shí)間表C ++ Drogon
排名:Drogon(RAW)(CSP):100%
Drogon(MORM)(CSP):81.6%
倉(cāng)庫(kù):
鋰
排名:鋰(ORM)(RAW):59.2%
倉(cāng)庫(kù):
RustActix-web
排名:Actix(RAW)(HBS):89.5%
Actix(柴油)(HBS):23.6%
倉(cāng)庫(kù):