整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          李開(kāi)復(fù)張亞勤重磅對(duì)談,頂級(jí)AI大咖共話未來(lái),200萬(wàn)網(wǎng)友在線圍觀

          輯部 發(fā)自 凹非寺

          量子位 報(bào)道 | 公眾號(hào) QbitAI

          “一起花光比爾蓋茨的8000萬(wàn)美金,來(lái)不來(lái)?”

          23年前,李開(kāi)復(fù)跟張亞勤這樣“畫餅”,于是亞洲最牛的計(jì)算機(jī)研究院就此誕生!

          如今,他們一個(gè)是最具影響力的VC代表,他創(chuàng)辦的創(chuàng)新工場(chǎng)已成為很多技術(shù)創(chuàng)新和前沿科技企業(yè)的精準(zhǔn)捕手,他出版的書(shū)籍,不少登上暢銷書(shū)排行榜。

          另一個(gè)則是清華智能產(chǎn)業(yè)研究院院長(zhǎng)、清華智能科學(xué)講席教授,前不久他剛當(dāng)選中國(guó)工程院外籍院士。加之此前美國(guó)藝術(shù)與科學(xué)院院士、澳洲國(guó)家工程院院士,成為“三院院士”

          結(jié)果在MEET2022智能未來(lái)大會(huì)的現(xiàn)場(chǎng),兩人時(shí)隔多年首次同臺(tái),在近兩百萬(wàn)觀眾面前,揭秘相識(shí)往事,也分享了各自對(duì)于科技發(fā)展趨勢(shì)的看法。

          從網(wǎng)友的反應(yīng)上看,這次巔峰對(duì)話足以滿足他們的期待。甚至還吸引了數(shù)十家主流媒體關(guān)注報(bào)道。

          巔峰對(duì)話還有哪些亮點(diǎn)?以及十余位頂級(jí)AI大咖分享更多精彩內(nèi)容,老樣子,我們?cè)敿?xì)道來(lái),一文看盡。

          李開(kāi)復(fù)張亞勤揭秘相識(shí)往事

          李開(kāi)復(fù)張亞勤的巔峰對(duì)話環(huán)節(jié),主要討論了三個(gè)方面。

          首先,他們回憶起23年前回國(guó)創(chuàng)建微軟亞洲研究院MSRA的事情。

          當(dāng)時(shí)李開(kāi)復(fù)給張亞勤打電話,就“畫了很大的餅”。他們想一同打造中國(guó)計(jì)算機(jī)的黃埔軍校,以此證明給全世界看,中國(guó)人也能做最頂級(jí)的科研。

          結(jié)果就在張亞勤決定回國(guó),到北京第一天就被李開(kāi)復(fù)修理了。

          嗯,理發(fā)的理。

          張亞勤回憶到,當(dāng)時(shí)跟沈向洋一同回國(guó),頭發(fā)因?yàn)楹荛L(zhǎng)時(shí)間沒(méi)打理,他們就被李開(kāi)復(fù)帶去理發(fā)了。

          如今回過(guò)頭看,當(dāng)初說(shuō)要建立個(gè)亞洲最牛、全球一流的計(jì)算機(jī)實(shí)驗(yàn)室這一個(gè)目標(biāo),在張亞勤看來(lái)已經(jīng)實(shí)現(xiàn),尤其在培養(yǎng)人才這方面。

          而且過(guò)程中,也有讓他們感到意外和大受震撼的進(jìn)展。

          比如李開(kāi)復(fù)舉例,誰(shuí)能想到后來(lái)的AI四小龍的創(chuàng)始團(tuán)隊(duì),都有微軟亞洲研究院的背景。

          還有像現(xiàn)在頂尖高校、大企業(yè)CTO以及一些創(chuàng)業(yè)公司,都有特別多當(dāng)時(shí)培養(yǎng)的人才。

          我們感覺(jué)特別欣慰,有種桃李滿天下的感覺(jué)。

          接著,他們探討了當(dāng)下最流行議題和技術(shù)風(fēng)向。

          比如元宇宙

          李開(kāi)復(fù)認(rèn)為,它肯定會(huì)到來(lái)的,但五年之內(nèi)不會(huì)有特別巨大的公司或應(yīng)用出現(xiàn)。

          張亞勤則補(bǔ)充,要用開(kāi)放的心態(tài)去看待元宇宙。

          一方面,如果說(shuō),元宇宙是真實(shí)世界與虛擬世界的融合,但以真實(shí)世界為主的話。

          很多公司已經(jīng)在做了,目前產(chǎn)品形態(tài)是技術(shù)的一種拓展。

          另一方面,要說(shuō)元宇宙是完全的虛擬世界,和真實(shí)世界沒(méi)關(guān)系,那可能走得就太遠(yuǎn)了一點(diǎn)。現(xiàn)在也有不少炒作,技術(shù)也并不成熟,還需要不斷地發(fā)展。

          再比如,科學(xué)家創(chuàng)業(yè)的熱議趨勢(shì)。

          兩位老朋友一致認(rèn)為,科學(xué)家創(chuàng)業(yè)需要一個(gè)企業(yè)家伙伴

          張亞勤還補(bǔ)充道,科學(xué)家還需要專注。如果決定創(chuàng)業(yè),那就出來(lái)做這件事。他認(rèn)為科學(xué)家同時(shí)上課做科研,還要管理公司是很困難的。

          最后他們放眼未來(lái),有哪些領(lǐng)域和賽道值得看好。

          張亞勤提及了AI與生物計(jì)算和生命科學(xué)交叉、無(wú)人駕駛和智慧交通,以及IOT。

          而李開(kāi)復(fù)Pick的第一個(gè)與張亞勤相同,除此之外還有機(jī)器人領(lǐng)域,尤其在工業(yè)制造上的應(yīng)用,以及自然語(yǔ)言理解。

          尤其是自然語(yǔ)言理解,李開(kāi)復(fù)認(rèn)為它在近幾年的發(fā)展跟當(dāng)年CNN、DNN一樣,正從感知智能迅速邁向認(rèn)知智能。未來(lái)AI一旦超越人類,就能做很多輔助、取代人類的工作。

          而至于自身的未來(lái)小目標(biāo),張亞勤還是繼續(xù)3.0人生——把AIR做起來(lái),李開(kāi)復(fù)則是想用行動(dòng)證明做高科技的投資回報(bào)要比互聯(lián)網(wǎng)更高。

          哦對(duì),這當(dāng)中還有個(gè)小插曲。

          當(dāng)兩位被問(wèn)到,如果有項(xiàng)超能力——可以復(fù)制對(duì)方的能力,那會(huì)如何選擇。

          李開(kāi)復(fù)首先就說(shuō),會(huì)復(fù)制張亞勤12歲就能讀大學(xué)的天才能力。

          而張亞勤,最想復(fù)制李開(kāi)復(fù)吃遍美食還不胖”的能力。

          此外,亞勤還說(shuō)想復(fù)制他對(duì)未來(lái)的洞察,以及可以用簡(jiǎn)單的語(yǔ)言把復(fù)雜事物表述總結(jié)出來(lái)的能力。

          李開(kāi)復(fù)和張亞勤的巔峰對(duì)話,由量子位總編輯李根主持,在對(duì)話環(huán)節(jié)最后,他表示能夠促成開(kāi)復(fù)和亞勤的這樣一次“老友對(duì)談”,是量子位一直以來(lái)的愿望——

          不僅是因?yàn)閮晌淮罂Ы駮r(shí)今日的地位和成就,更是因?yàn)樗麄冊(cè)?3年前作出的回中國(guó)的決定,某種程度上來(lái)講,奠定了如今智能未來(lái)的基礎(chǔ)。

          而且更關(guān)鍵的是,開(kāi)復(fù)和亞勤,還都在繼續(xù)為產(chǎn)業(yè)培育人才、鼓勵(lì)創(chuàng)新,是中國(guó)智能產(chǎn)業(yè)領(lǐng)域當(dāng)之無(wú)愧的兩座高峰。

          清華張亞勤:下個(gè)十年是AI與生物制藥融合的大好時(shí)機(jī)

          實(shí)際上,在巔峰對(duì)話開(kāi)始前,清華大學(xué)智能科學(xué)講席教授、清華智能產(chǎn)業(yè)研究院院長(zhǎng)張亞勤,還以開(kāi)場(chǎng)主題演講的形式,分享了他對(duì)趨勢(shì)——特別是AI+生命科學(xué)的判斷。

          清華智能產(chǎn)業(yè)研究院AIR于2020年成立,其使命是用人工智能技術(shù)賦能產(chǎn)業(yè)推動(dòng)社會(huì)進(jìn)步。

          清華AIR選擇了三個(gè)方向作為突破點(diǎn):智能交通、智慧物聯(lián)、智慧醫(yī)療。張亞勤這次分享的重點(diǎn)是智慧醫(yī)療方向中,人工智能如何賦能生命科學(xué)。

          他認(rèn)為整個(gè)信息產(chǎn)業(yè)過(guò)去三十年最大的突破就是數(shù)字化,從開(kāi)始的內(nèi)容數(shù)字化、企業(yè)數(shù)字化,到現(xiàn)在進(jìn)入物理世界的數(shù)字化和生物世界的數(shù)字化。

          一方面我們的身體從大腦、器官,到細(xì)胞、蛋白質(zhì)、基因、分子都在數(shù)字化,另一方面人工智能算法、算力和系統(tǒng)的快速進(jìn)展讓大量數(shù)據(jù)有了使用的場(chǎng)所。

          以前新藥研發(fā)需要超過(guò)十幾年的周期,十億美元的投入, AI正在改變這種狀況。

          新冠疫苗去年年底進(jìn)入臨床試驗(yàn),今年大規(guī)模使用,這可能是人類歷史上最快的一次計(jì)算機(jī)科學(xué)包括人工智能加速疫苗開(kāi)發(fā)的例子。

          另外遷移學(xué)習(xí)用少量原始數(shù)據(jù)加上動(dòng)物模型快速發(fā)現(xiàn)了對(duì)罕見(jiàn)病的藥物,幾何深度學(xué)習(xí)找出了廣譜、穩(wěn)定的新冠抗體,對(duì)變種株也有效,Swin Transformer用于測(cè)序基因里90%的未編碼部分……

          張亞勤總結(jié)道,AI和生命科學(xué)有很多可合作的地方,能讓生物制藥更快速、精準(zhǔn)、安全,更經(jīng)濟(jì)、普惠。

          但同時(shí)也有很多壁壘,算法的透明性、可解釋性、隱私安全、倫理等挑戰(zhàn),以及如何把兩個(gè)行業(yè)無(wú)縫連接起來(lái)。

          由此研究院提出了「AI+生命科學(xué)破壁計(jì)劃」作為前沿研究任務(wù),跨越兩個(gè)領(lǐng)域的鴻溝、打破壁壘促進(jìn)AI與生命科學(xué)的深度交叉融合,構(gòu)建AI+生命科學(xué)的研究和技術(shù)生態(tài)。

          張亞勤看見(jiàn)了生物世界的數(shù)字化和AI技術(shù)的進(jìn)展,相信下個(gè)十年是生物制藥和人工智能融合的大好時(shí)機(jī),也是行業(yè)發(fā)展的最大的機(jī)遇。

          百度吳甜:技術(shù)創(chuàng)新持續(xù)為產(chǎn)業(yè)發(fā)展注入新動(dòng)能

          百度集團(tuán)副總裁、深度學(xué)習(xí)技術(shù)及應(yīng)用國(guó)家工程實(shí)驗(yàn)室副主任吳甜解讀了技術(shù)創(chuàng)新與產(chǎn)業(yè)發(fā)展的關(guān)系。

          根據(jù)中國(guó)信息通信研究院的數(shù)據(jù),2020年我國(guó)數(shù)字經(jīng)濟(jì)已經(jīng)達(dá)到了39.2萬(wàn)億元,占GDP總值的38.6%,位居世界第二。未來(lái)這個(gè)數(shù)值的絕對(duì)值和相對(duì)比例都會(huì)持續(xù)增加,數(shù)字產(chǎn)業(yè)化和產(chǎn)業(yè)數(shù)字化齊頭并進(jìn)。

          產(chǎn)業(yè)發(fā)展角度,可以看到產(chǎn)業(yè)使用人工智能的場(chǎng)景廣泛且分散,技術(shù)與產(chǎn)業(yè)的結(jié)合越來(lái)越深入、專業(yè),未來(lái)前景會(huì)更大更廣闊。

          技術(shù)發(fā)展角度,人工智能呈現(xiàn)出明顯的融合創(chuàng)新趨勢(shì),包括軟硬一體融合、跨模態(tài)多技術(shù)融合、知識(shí)與深度學(xué)習(xí)融合、技術(shù)與場(chǎng)景融合。

          雖然底層技術(shù)越變?cè)綇?fù)雜,但所幸能夠通過(guò)開(kāi)源開(kāi)放的人工智能平臺(tái)降低門檻,使AI開(kāi)發(fā)變得越來(lái)越容易。

          如金融領(lǐng)域常見(jiàn)的智能合同解析與管理場(chǎng)景,傳統(tǒng)都是靠人工方式從合同中提取三十多個(gè)維度信息,效率低,而保險(xiǎn)的產(chǎn)品迭代速度又很快,相應(yīng)的保險(xiǎn)條款也在增加和變化,人工識(shí)別一份合同需要30分鐘。技術(shù)工程師在開(kāi)發(fā)平臺(tái)上使用ERNIE訓(xùn)練了條款智能解析模型,并持續(xù)進(jìn)行迭代優(yōu)化,部署到保險(xiǎn)業(yè)務(wù)平臺(tái)中,提供智能解析能力,對(duì)合同文本實(shí)現(xiàn)了智能解析,達(dá)到通過(guò)智能輔助后單份合同解析時(shí)長(zhǎng)縮短為1分鐘。

          像這樣的變化,在各個(gè)行業(yè)當(dāng)中都在發(fā)生。

          吳甜總結(jié)道,一方面是產(chǎn)業(yè)的需求越來(lái)越旺盛,越來(lái)越多和廣泛,另一方面技術(shù)本身也給我們帶來(lái)新的想象空間,技術(shù)創(chuàng)新持續(xù)為產(chǎn)業(yè)當(dāng)中運(yùn)用人工智能技術(shù)注入新的動(dòng)能,注入新的活力。

          IBM謝東:如何讓技術(shù)創(chuàng)新驅(qū)動(dòng)環(huán)境智能和企業(yè)可持續(xù)發(fā)展

          IBM副總裁、大中華區(qū)首席技術(shù)官謝東博士為我們分享「加速科技創(chuàng)新,共贏可持續(xù)未來(lái)」的議題。

          從全球發(fā)展?fàn)顩r來(lái)看,可持續(xù)發(fā)展是我們共同面對(duì)的戰(zhàn)略議題。世界經(jīng)濟(jì)論壇2021年全球風(fēng)險(xiǎn)報(bào)告指出,未來(lái)十年企業(yè)面臨前的三大業(yè)務(wù)風(fēng)險(xiǎn)都與環(huán)境相關(guān)。

          在中國(guó)雙碳目標(biāo)下,可持續(xù)發(fā)展不光是我們所有企業(yè)的社會(huì)責(zé)任,更加已經(jīng)成為企業(yè)必須面對(duì)的戰(zhàn)略議題。對(duì)于企業(yè)應(yīng)該如何面對(duì)這些挑戰(zhàn),新技術(shù)突破會(huì)給行業(yè)帶來(lái)哪些轉(zhuǎn)變?

          謝東博士從三個(gè)維度做了梳理。

          企業(yè)治理角度,IBM非常注重可持續(xù)發(fā)展問(wèn)題,早在50年前,制定了首個(gè)企業(yè)環(huán)境的政策,2000年提出二氧化碳減排目標(biāo);與全球各行業(yè)客戶建立可持續(xù)發(fā)展咨詢委員會(huì)。

          當(dāng)中還為助力中國(guó)企業(yè)實(shí)現(xiàn)碳中和制定四階段戰(zhàn)略建議,包括確保合規(guī)、優(yōu)化流程及供應(yīng)鏈、重塑業(yè)務(wù)、引領(lǐng)行業(yè)。

          基于環(huán)境問(wèn)題,IBM推出環(huán)境智能套件,涵蓋人工智能、數(shù)據(jù)分析、環(huán)境數(shù)據(jù)分層、混合云、物聯(lián)網(wǎng)與區(qū)塊鏈。

          在技術(shù)平臺(tái)助力環(huán)境議題和創(chuàng)新的維度,以IBM位于蘇黎世的云上自主化學(xué)實(shí)驗(yàn)室RoboRXN為例,全球可以通過(guò)網(wǎng)絡(luò)直接訪問(wèn)到實(shí)驗(yàn)室,遠(yuǎn)程完成了從文獻(xiàn)檢索到一些科研探索,再到功能驗(yàn)證各個(gè)環(huán)節(jié)。

          過(guò)去兩年,化學(xué)實(shí)驗(yàn)室RoboRXN采用的免費(fèi)AI模型,已經(jīng)為學(xué)生、科學(xué)家和實(shí)驗(yàn)者完成了近100萬(wàn)次反應(yīng)預(yù)測(cè)。

          而背后能支撐這一系列環(huán)境和可持續(xù)發(fā)展創(chuàng)新的底層計(jì)算技術(shù)又是怎樣的?謝東博士提到了最新推出的2nm芯片技術(shù)、帶有片內(nèi)AI加速器的處理器Telum,以及前不久發(fā)布的突破127 量子位量子處理器。謝東博士認(rèn)為,量子計(jì)算機(jī)規(guī)模化商用可能已經(jīng)在不遠(yuǎn)的未來(lái)了。

          小冰李笛:AI相比人類創(chuàng)作者,不存在瓶頸期

          小冰公司首席執(zhí)行官李笛認(rèn)為,有時(shí)候人們會(huì)過(guò)于高估人工智能在IQ方向的進(jìn)展,卻低估了人工智能在EQ方面蘊(yùn)藏的巨大潛力。

          那些出現(xiàn)在人類身邊、與人類共存的「AI being」都應(yīng)該有自己擅長(zhǎng)和不擅長(zhǎng)的領(lǐng)域,有自己的性格和觀念,無(wú)所不知、無(wú)所不能的AI反而是面目不清的。

          在迪拜世博會(huì)中國(guó)館,正在展出AI畫家夏語(yǔ)冰的一系列水墨畫作品《山水精神》。

          夏語(yǔ)冰除了創(chuàng)作能力也有著自己的面容、口音和創(chuàng)作觀念,與另一位AI畫家山東大哥完全不同。

          李笛指出,如果要賦予AI創(chuàng)造力,它對(duì)不同事情的觀念要有一致性,并反映在其所創(chuàng)造的東西上,才能讓人類不感到違和。

          當(dāng)人工智能習(xí)得一定創(chuàng)作能力的時(shí)候,和人類創(chuàng)作者區(qū)別是什么?

          第一,人類創(chuàng)作到了巔峰之后便開(kāi)始滑坡,人工智能沒(méi)有巔峰,要么是停滯的、要么會(huì)繼續(xù)向上攀登,時(shí)間周期非常久。

          第二,人類在同一時(shí)間只能專注地做一件事情,但人工智能是可以高并發(fā)的。

          創(chuàng)造力只是小冰框架中的一小部分,最難的是如何賦予AI有趣的靈魂,真正和人類交流。

          李笛看到人工智能在EQ方面蘊(yùn)藏的巨大潛力,他相信我們這一代是與多樣的人工智能生活在一起的第一代人類。

          Rokid祝銘明:元宇宙更應(yīng)專注虛實(shí)融合

          Rokid創(chuàng)始人CEO祝銘明則在大會(huì)上探討了AR智能眼鏡行業(yè)的應(yīng)用落地探索。

          當(dāng)前大家談元宇宙,很多人談的是創(chuàng)想與未來(lái),Rokid關(guān)注的是技術(shù)落地能力,主要有5個(gè)方面:

          感知——理解——協(xié)同——展現(xiàn)(光學(xué)技術(shù)、圖形引擎)——數(shù)字資產(chǎn)/內(nèi)容(創(chuàng)作、生產(chǎn)工具)

          祝銘明介紹,Rokid是一家產(chǎn)品平臺(tái)型公司,除了上述五種能力,還會(huì)考慮一些載體去做和大家進(jìn)行交互,也根據(jù)自己思考分成了四個(gè)象限。

          橫軸代表以穿戴性、佩戴性為出發(fā)點(diǎn)去衡量,從專用場(chǎng)景到日常佩戴(從左到右)。

          縱軸是以展現(xiàn)能力為一個(gè)衡量點(diǎn)去思考,從內(nèi)容屬性到工作屬性(從上到下)。

          第一層,感知能力,如半導(dǎo)體、傳感器等技術(shù)。

          第二層,關(guān)注在感知基礎(chǔ)上如何理解世界,理解周邊的環(huán)境、理解人、理解事。

          第三層為協(xié)同,深度思考人和人、人和事物之間的協(xié)同關(guān)系,但不是創(chuàng)造虛擬世界,而是融合真實(shí)世界和數(shù)字世界。

          第四層,視覺(jué)和感官層的展現(xiàn)能力,背后涉及光學(xué)、圖形引擎、算法、空間引擎等技術(shù)。

          最后,為數(shù)字資產(chǎn)(數(shù)字內(nèi)容生產(chǎn))。包括創(chuàng)作工具、生產(chǎn)工具、管理、安全等方面的能力。

          過(guò)程中,祝銘明還強(qiáng)調(diào),Rokid做人機(jī)交互有著不同的階段,從最早指令型的人機(jī)交互,到后面圖形化的所見(jiàn)即所得的人機(jī)交互,對(duì)人類越來(lái)越友好。

          在分享的最后,他提出了自己對(duì)于元宇宙的思考。

          如果元宇宙是一種發(fā)展方向,那我們覺(jué)得元宇宙不應(yīng)該是局限于虛擬世界,如何將人與真實(shí)世界和虛擬世界做一個(gè)完整的融合,不應(yīng)該割裂開(kāi),這是我們一直在主導(dǎo)的事情。

          他看到了人機(jī)交互的巨大潛力,他相信在未來(lái),真實(shí)世界跟數(shù)字世界將進(jìn)行融合而非割裂。

          亞信科技?xì)W陽(yáng)曄:5G把AI 能力投送到邊緣


          亞信科技首席技術(shù)官、高級(jí)副總裁歐陽(yáng)曄帶來(lái)了《5G網(wǎng)絡(luò)助推邊緣AI》的主題演講。

          以2006年AI第三次發(fā)展浪潮開(kāi)始作為節(jié)點(diǎn)到現(xiàn)在的15年間,通信領(lǐng)域與AI相關(guān)的學(xué)術(shù)成果發(fā)表數(shù)量是之前15年的6.42倍。同時(shí)隨著5G技術(shù)與業(yè)務(wù)的發(fā)展,云端智能需向邊緣遷移。

          通信技術(shù)作為數(shù)字化轉(zhuǎn)型的基礎(chǔ)設(shè)施,該如何利用5G通信技術(shù)把AI能力投送到千行百業(yè)的邊緣觸點(diǎn)?

          歐陽(yáng)曄博士介紹了5G網(wǎng)絡(luò)投送AI能力到達(dá)邊緣的三種模式:

          • 5G網(wǎng)絡(luò)切片,可以理解成在現(xiàn)有的公有網(wǎng)絡(luò)里構(gòu)建一層專用的高速隧道。
          • 5G獨(dú)立專網(wǎng),企業(yè)搭建的私有網(wǎng)絡(luò)。
          • 5G混合專網(wǎng),專網(wǎng)與公網(wǎng)共享基站的模式。

          AI能力投送到邊緣后并不是就能直接應(yīng)用到各種to B和to C場(chǎng)景,而是通過(guò)第五代移動(dòng)通信邊緣計(jì)算平臺(tái)承載多種通用目的技術(shù)(如AI,數(shù)字孿生,數(shù)據(jù)治理與AIoT等)構(gòu)建云邊端協(xié)同整體方案。

          隨后歐陽(yáng)曄介紹了基于五代移動(dòng)通信邊緣計(jì)算平臺(tái)的智慧電廠、智慧工地和智慧園區(qū)3個(gè)典型場(chǎng)景案例。

          歐陽(yáng)曄指出通信和AI兩個(gè)領(lǐng)域的發(fā)展相關(guān)性將越來(lái)越強(qiáng),他相信在未來(lái),應(yīng)用層廠家、通信基礎(chǔ)設(shè)施廠家以及運(yùn)營(yíng)商合作伙伴要共同努力,共同觸及通信人工智能未來(lái)十年的發(fā)展。

          京東何曉冬:對(duì)話本質(zhì)上是博弈與決策,語(yǔ)言只是一種表現(xiàn)形式

          京東集團(tuán)副總裁、京東探索研究院常務(wù)副院長(zhǎng)何曉冬則分享了多模態(tài)智能人機(jī)交互技術(shù)在復(fù)雜場(chǎng)景中的進(jìn)化,以及技術(shù)落地給人類創(chuàng)造價(jià)值。

          提到人工智能,往往會(huì)想到語(yǔ)音識(shí)別,圖像識(shí)別、人臉識(shí)別、甚至機(jī)器翻譯。

          對(duì)話智能是種什么智能?某種程度上講是一種融合性智能,前面提到單點(diǎn)基礎(chǔ)技術(shù)都被融合在其中。

          簡(jiǎn)單說(shuō),對(duì)話智能就是希望打造一個(gè)機(jī)器,它能夠自如像人一樣跟你對(duì)話交流溝通關(guān)懷,完成任務(wù)。

          表現(xiàn)上看,它是種非常自然地交互方式;從技術(shù)上看,它需要感知智能、情感智能、認(rèn)知智能、多輪對(duì)話管理。

          何曉冬認(rèn)為,對(duì)話即決策,本質(zhì)上來(lái)說(shuō)對(duì)話本質(zhì)上是博弈與決策,語(yǔ)言只是一種表現(xiàn)形式。

          接著,何曉冬介紹了在京東是如何迭代技術(shù)、讓這項(xiàng)技術(shù)為更多用戶所用、創(chuàng)造更多的價(jià)值。

          簡(jiǎn)單來(lái)說(shuō),兩種模式并行:打造前沿的技術(shù)能力,同時(shí)把前沿的技術(shù)推向千行百業(yè)應(yīng)用落地。

          剛剛過(guò)去的雙十一,何曉冬團(tuán)隊(duì)通過(guò)智能人機(jī)對(duì)話系統(tǒng)打造的京東智能客服言犀,累計(jì)服務(wù)了超過(guò)7.4億咨詢量、16.5萬(wàn)的第三方商家,智能物流預(yù)約外呼超過(guò)了193萬(wàn)通電話,完成2.1億次的質(zhì)量檢測(cè),在整個(gè)京東的售前、售中、售后、物流各個(gè)環(huán)節(jié)實(shí)現(xiàn)了客服服務(wù)全鏈路的場(chǎng)景智能化。

          大會(huì)現(xiàn)場(chǎng)何博士還給我們演示了智能人機(jī)對(duì)話系統(tǒng)服務(wù)成都顧客的真實(shí)案例~

          而為了讓機(jī)器人做得更好,京東還打造了五個(gè)維度的服務(wù)評(píng)價(jià)質(zhì)量指數(shù),來(lái)評(píng)價(jià)機(jī)器人和人之間的差距,展示京東在智能人機(jī)對(duì)話領(lǐng)域深刻的沉淀。

          除了服務(wù)京東本身以外,他們的多模態(tài)智能人機(jī)交互技術(shù)還運(yùn)用到更多行業(yè)當(dāng)中去,比如政府的政務(wù)熱線、金融行業(yè)的業(yè)務(wù)客服等。

          展望未來(lái)五年,人工智能的三大支柱數(shù)據(jù)、算力、算法,都會(huì)得到進(jìn)一步升級(jí)場(chǎng)景、系統(tǒng)、算力。

          數(shù)據(jù)升級(jí)成持續(xù)運(yùn)作的“活”場(chǎng)景數(shù)據(jù);單點(diǎn)的算法進(jìn)一步提升至綜合性的AI系統(tǒng),包括多算法互相協(xié)同、聯(lián)合優(yōu)化,這樣才能打造真正端到端、高價(jià)值的AI系統(tǒng)。

          商湯楊帆:AI算法下一個(gè)時(shí)代是端到端系統(tǒng)化整合

          商湯科技聯(lián)合創(chuàng)始人、商湯集團(tuán)副總裁楊帆認(rèn)為,賦能產(chǎn)業(yè)升級(jí)是AI的核心價(jià)值所在。

          今天在各行各業(yè)都有對(duì)AI的剛需存在。

          如工業(yè)檢測(cè)分析的痛點(diǎn)是效率低、漏檢率高和標(biāo)準(zhǔn)不統(tǒng)一、檢測(cè)人員水平差異大等。城市管理分析中事故的偶發(fā)性高、分散,需要大量人力投入。

          楊帆說(shuō),眼下AI企業(yè)會(huì)越來(lái)越面臨一種「幸福的煩惱」。

          幸福之處在于剛需大量存在,煩惱之處在于剛需碎片化、場(chǎng)景多樣化,AI企業(yè)提供技術(shù)創(chuàng)新的成本,包括邊際成本比較高,造成了AI產(chǎn)業(yè)進(jìn)一步發(fā)展面臨的供需匹配失調(diào)的問(wèn)題。

          要解決這些煩惱一方面需要有通用能力的基礎(chǔ)設(shè)施為人工智能產(chǎn)業(yè)創(chuàng)新提供支撐,另一方面需要跨組織之間的聯(lián)合和協(xié)作。

          楊帆從在商湯做算法的經(jīng)歷出發(fā),總結(jié)出算法的三個(gè)時(shí)代。

          第一個(gè)時(shí)代像手工業(yè),非常依賴個(gè)體科學(xué)家的個(gè)人水平。

          第二個(gè)時(shí)代就是過(guò)去這5年,像工業(yè)化流水線,能夠用更多系統(tǒng)把算法創(chuàng)造的各個(gè)環(huán)節(jié)整合打通,持續(xù)的規(guī)模化的生產(chǎn)技術(shù)創(chuàng)新。

          下一個(gè)時(shí)代該是什么?楊帆認(rèn)為技術(shù)創(chuàng)新會(huì)走向更加通用、低成本高效,就像工業(yè)流水線趨勢(shì)是自動(dòng)化智能化。

          從底層基礎(chǔ)設(shè)施,到硬件,再到軟件和上游應(yīng)用,形成端到端系統(tǒng)化模式,把各個(gè)環(huán)節(jié)進(jìn)行更加標(biāo)準(zhǔn)化的定義以及有機(jī)組合。

          端到端整合可以帶來(lái)更高的安全性以及更低的網(wǎng)絡(luò)時(shí)延,同時(shí)把算法打造成像樂(lè)高積木塊一樣,提供給產(chǎn)業(yè)內(nèi)的大家共同去打造有價(jià)值的應(yīng)用。

          楊帆看到了行業(yè)剛需當(dāng)下沒(méi)有被很好的滿足,他相信平臺(tái)化、規(guī)模化、低成本高效率的工具體系,會(huì)讓整個(gè)產(chǎn)業(yè)技術(shù)創(chuàng)新走得更快。

          思謀劉樞:AI技術(shù)正在成為一種新型生產(chǎn)要素

          思謀科技聯(lián)合創(chuàng)始人兼技術(shù)負(fù)責(zé)人劉樞在大會(huì)分享了思謀科技如何用AI推動(dòng)制造業(yè)數(shù)字化智能化轉(zhuǎn)型。

          人工智能在推動(dòng)經(jīng)濟(jì)發(fā)展的同時(shí),也在創(chuàng)造虛擬勞動(dòng)力,去做人類不想做、做不好、不能做的事情,同時(shí)當(dāng)人工智能在很多行業(yè)落地的時(shí)候,可以拉動(dòng)其上下游協(xié)同發(fā)展和創(chuàng)新。

          因此作為兩年即長(zhǎng)成獨(dú)角獸的思謀科技,認(rèn)為“人工智能技術(shù)正在成為一種新的生產(chǎn)要素”。

          埃森哲曾預(yù)測(cè)到2035年,人工智能可以將年經(jīng)濟(jì)增長(zhǎng)率額外提升1.6%,人工智能作為單獨(dú)技術(shù)將額外帶來(lái)8千億美金增長(zhǎng),而如果作為生產(chǎn)要素去評(píng)估,將帶來(lái)6萬(wàn)億美金的規(guī)模增長(zhǎng)。

          再來(lái)看制造業(yè)的發(fā)展,總共經(jīng)歷了三個(gè)階段:自動(dòng)化-信息化-智能化,如今智能制造蘊(yùn)含著巨大發(fā)展機(jī)遇。

          智能制造,關(guān)鍵在于智能——即讓制造擁有大腦,自動(dòng)化只是手臂,把決策變?yōu)楝F(xiàn)實(shí)。但實(shí)際落地過(guò)程中,思謀科技遇到了些有意思的問(wèn)題,這與熟悉的自然場(chǎng)景有許多不同。

          首先,數(shù)據(jù)極度短缺。在工業(yè)場(chǎng)景里面,很多時(shí)候每一種缺陷的圖片數(shù)量都達(dá)不到10。

          第二,工業(yè)驗(yàn)收要求非常高。以手機(jī)為例,如果要求手機(jī)成品良率99%,假設(shè)一臺(tái)手機(jī)含200個(gè)零件,那么每個(gè)零件良率都需達(dá)到99.99%。

          第三,被檢形態(tài)非常多。常用器件就可能有成百上千種不同的形狀。

          第四,缺陷難以區(qū)分。

          劉樞認(rèn)為,只有當(dāng)系統(tǒng)可以自動(dòng)實(shí)現(xiàn)算法組合和部署,人類只需要少量定制化算法設(shè)置的時(shí)候,才有可能實(shí)現(xiàn)AI跨領(lǐng)域規(guī)模產(chǎn)業(yè)化。

          如果沒(méi)有自動(dòng)實(shí)現(xiàn)算法組合和部署的系統(tǒng),在高端制造業(yè)實(shí)現(xiàn)AI全面產(chǎn)業(yè)化會(huì)非常艱難。

          以智能手機(jī)為例,零件供應(yīng)商平均來(lái)講有400個(gè),每個(gè)供應(yīng)商有五個(gè)制程,每個(gè)制程又有15條產(chǎn)線,如果一條產(chǎn)線都做一個(gè)模型,大概要做3萬(wàn)個(gè)模型。

          再放眼全行業(yè)前五的品牌,每個(gè)品牌6款產(chǎn)品,則需要90萬(wàn)個(gè)不同的算法模型,這其中還不算第二年、第三年的軟硬件升級(jí)迭代。

          為了達(dá)到這一目標(biāo),思謀科技研發(fā)了AI算法平臺(tái)SMAP,以及沉淀了AI Know-How的DataFlow系統(tǒng)。

          最后,劉樞還分享了智能制造的核心原則:普適性,計(jì)算為先和永不間斷的學(xué)習(xí)。

          當(dāng)AI系統(tǒng)設(shè)計(jì)能夠自動(dòng)化,當(dāng)AI部署和運(yùn)營(yíng)能夠自動(dòng)化的時(shí)候,就一定能夠?qū)崿F(xiàn)新一代智能產(chǎn)業(yè)的變革。

          數(shù)牘科技蔡超超:隱私計(jì)算,構(gòu)建下一代數(shù)據(jù)流通底層的關(guān)鍵設(shè)施

          數(shù)牘科技聯(lián)合創(chuàng)始人兼CTO蔡超超分享的主題是《隱私計(jì)算構(gòu)建下一代數(shù)據(jù)流通底層的關(guān)鍵設(shè)施》。

          剛才我們提到智能駕駛場(chǎng)景,就和隱私計(jì)算有很大的相關(guān)性。

          智能汽車在運(yùn)行過(guò)程中產(chǎn)生大量圖片、音頻甚至位置數(shù)據(jù),都涉及到用戶的隱私。這些數(shù)據(jù)的高效開(kāi)發(fā)利用需要在保護(hù)數(shù)據(jù)安全的情況下進(jìn)行,需要用到隱私計(jì)算。

          隱私計(jì)算是一種在數(shù)據(jù)不可見(jiàn)的前提下,讓信息進(jìn)行價(jià)值流通的工程和技術(shù)體系,涉及多方安全計(jì)算,聯(lián)邦學(xué)習(xí)、可信執(zhí)行環(huán)境、差分隱私、同態(tài)加密、區(qū)塊鏈等多種技術(shù)。

          蔡超超同時(shí)認(rèn)為隱私計(jì)算體系不是一個(gè)單一的系統(tǒng),它其實(shí)是一個(gè)網(wǎng)絡(luò),一個(gè)底層平臺(tái),包含了不同的參與方。

          每個(gè)參與方的主體可能是人、是車或其他設(shè)備,這些主體都會(huì)有自己的ID,比如身份證、電話號(hào)碼、設(shè)備號(hào),在數(shù)據(jù)合作之前需要有共同的語(yǔ)言把ID有效統(tǒng)一對(duì)齊起來(lái),才能進(jìn)行安全的數(shù)據(jù)協(xié)作。

          基于隱私計(jì)算的ID系統(tǒng)可以做到匿名化、原始ID和敏感信息不可追溯、不可還原。

          接下來(lái),讓多方在不交換原始數(shù)據(jù)的前提下進(jìn)行安全合規(guī)的數(shù)據(jù)協(xié)作,應(yīng)用于反欺詐、反洗錢、精準(zhǔn)營(yíng)銷、聯(lián)合風(fēng)控等一系列場(chǎng)景。

          蔡超超看到了有數(shù)據(jù)價(jià)值交換的地方就有隱私計(jì)算的需求,他相信隱私計(jì)算平臺(tái)發(fā)展過(guò)程中需要注重安全可靠性、有完整的數(shù)據(jù)科學(xué)應(yīng)用體系以及工業(yè)級(jí)落地能力。

          智駕周圣硯:以規(guī)模化迎接智能駕駛平權(quán)時(shí)代

          智駕科技創(chuàng)始人兼CEO周圣硯在大會(huì)上分享了智駕視角下自動(dòng)駕駛產(chǎn)業(yè)以及今后發(fā)展是如何的。

          一開(kāi)場(chǎng),周圣硯就舉了一個(gè)小例子:如果問(wèn)消費(fèi)者,什么品牌汽車做的比較好,消費(fèi)者能輕易列出答案。但如果問(wèn)自動(dòng)駕駛有哪些比較好的公司,可能大多數(shù)消費(fèi)者都沒(méi)辦法答出。

          為什么會(huì)有這樣的現(xiàn)象?如果回顧互聯(lián)網(wǎng)行業(yè)的發(fā)展,就會(huì)發(fā)現(xiàn)它之所以能蓬勃發(fā)展,是因?yàn)楦采w了最廣大用戶群體。

          回顧過(guò)去幾年自動(dòng)駕駛的發(fā)展一直非常曲折,原因在于大家一直在技術(shù)路徑和商業(yè)模式上產(chǎn)生強(qiáng)烈的爭(zhēng)議。如今這些爭(zhēng)議依舊存在,但同時(shí)也確實(shí)感受到自動(dòng)駕駛正在實(shí)現(xiàn)并產(chǎn)生社會(huì)的正向價(jià)值

          SAE把自動(dòng)駕駛從工程學(xué)的角度分了L0-L5不同駕駛等級(jí),智駕科技MAXIEYE今天從解決問(wèn)題的角度重新分解自動(dòng)駕駛等級(jí)。

          首先,即第一個(gè)等級(jí),需要解決的是安全問(wèn)題,比如車輛的緊急制動(dòng)系統(tǒng)。

          第二個(gè)等級(jí),駕駛過(guò)程中的舒適性問(wèn)題,比如高速公路實(shí)現(xiàn)的全速巡航系統(tǒng)。

          第三個(gè)等級(jí),解決出行效率問(wèn)題。智駕科技MAXIEYE認(rèn)為在結(jié)構(gòu)化道路,比如城市道路和高速公路,可以實(shí)現(xiàn)點(diǎn)到點(diǎn)的自動(dòng)駕駛功能。

          第四個(gè)等級(jí),優(yōu)化交通能源的問(wèn)題,比如干線無(wú)人物流。前三個(gè)等級(jí)叫做人機(jī)共駕,最后一個(gè)等級(jí)才叫做無(wú)人駕駛。

          最后,他希望與行業(yè)一起迎接智能駕駛科技平權(quán)時(shí)代的到來(lái)。

          從市場(chǎng)維度,產(chǎn)品全面下探最廣泛的5-15萬(wàn)元車型,將覆蓋最廣大的用戶群體;從消費(fèi)者維度,提供消費(fèi)者用得起愿意用的智能駕駛產(chǎn)品;從產(chǎn)業(yè)鏈維度,全行業(yè)開(kāi)放共創(chuàng),建立行業(yè)共識(shí)和技術(shù)協(xié)同,全產(chǎn)業(yè)鏈去共同打造智能駕駛科技平權(quán)時(shí)代。

          周圣硯看到自動(dòng)駕駛需要覆蓋更廣大用戶群體,他相信未來(lái)AI將以數(shù)據(jù)驅(qū)動(dòng)方式助力智能駕駛系統(tǒng)越用越聰明。

          自動(dòng)駕駛圓桌論壇:量產(chǎn)、安全,變局時(shí)刻

          大會(huì)的最后階段,自動(dòng)駕駛行業(yè)大佬們圍繞「量產(chǎn)」展開(kāi)了激烈討論。

          先來(lái)介紹一下各位嘉賓:

          騰訊交通平臺(tái)部總經(jīng)理、自動(dòng)駕駛總經(jīng)理蘇奎峰

          過(guò)去一年騰訊從自動(dòng)駕駛測(cè)試工具鏈,以及智能聯(lián)網(wǎng)示范區(qū)、智慧高速等車路協(xié)同解決方案兩個(gè)方面助力產(chǎn)業(yè)發(fā)展。

          無(wú)人駕駛公司馭勢(shì)科技聯(lián)合創(chuàng)始人、首席系統(tǒng)架構(gòu)師彭進(jìn)展

          馭勢(shì)科技開(kāi)展了無(wú)人車在多個(gè)場(chǎng)景的商業(yè)化運(yùn)營(yíng),擁有在機(jī)場(chǎng)、工廠等場(chǎng)景幾百臺(tái)車7x24小時(shí)、365天持續(xù)不斷的運(yùn)營(yíng)能力。

          無(wú)人卡車公司主線科技CEO張?zhí)炖?/span>

          主線科技專注于自動(dòng)駕駛卡車,在幾個(gè)港口物流樞紐還有京津高速、京滬高速上運(yùn)行的車輛規(guī)模有150輛車左右,每天都在持續(xù)地運(yùn)行。

          那么開(kāi)始第一個(gè)話題,2021年怎么就成了自動(dòng)駕駛量產(chǎn)集中的一年?

          首先三位嘉賓都認(rèn)為政策很關(guān)鍵,三個(gè)團(tuán)隊(duì)創(chuàng)業(yè)之初都獲得了資金支持,來(lái)自國(guó)家自然科學(xué)基金。

          另外今年從北上廣深到武漢、長(zhǎng)沙、無(wú)錫再到衡陽(yáng),無(wú)論一線還是二三線城市都開(kāi)始積極推動(dòng)無(wú)人駕駛落地。

          張?zhí)炖滋岢龅诙€(gè)因素:場(chǎng)景

          張?zhí)炖子X(jué)得物流場(chǎng)景尤其是封閉的完全無(wú)人的,還有高速以及一些城區(qū)限定區(qū)域內(nèi)的場(chǎng)景,從今年開(kāi)始包括到明年年底很有可能有很多批量的應(yīng)用出來(lái)。

          彭進(jìn)展的角度是技術(shù)進(jìn)展,無(wú)人駕駛?cè)绻荒馨寻踩珕T拿掉,就體現(xiàn)不出真正的價(jià)值。

          只有真正把安全員拿掉,你的客戶和合作伙伴才會(huì)相信這件事真的能成功。

          最后蘇奎峰總結(jié)發(fā)言,政策、場(chǎng)景和技術(shù)全都交匯在今年這一點(diǎn),無(wú)人駕駛量產(chǎn)終于到來(lái)。

          第二個(gè)話題:量產(chǎn)之后,大眾都「看見(jiàn)」了自動(dòng)駕駛,未來(lái)行業(yè)會(huì)面臨哪些新的挑戰(zhàn)?

          雖然問(wèn)題比較寬泛,不過(guò)三位的表達(dá)不約而同的集中在了安全這個(gè)點(diǎn)。

          蘇奎峰提到,只要自動(dòng)駕駛的量產(chǎn)規(guī)模大了,原本的一些小概率事件也會(huì)變成常發(fā)事件,這不代表技術(shù)不好,但確實(shí)有許多長(zhǎng)尾的問(wèn)題需要預(yù)見(jiàn)和克服。

          他強(qiáng)調(diào):

          我們?cè)诎踩浴⒎€(wěn)定性上要有敬畏心。

          彭進(jìn)展認(rèn)為無(wú)人駕駛在安全上的優(yōu)勢(shì)在于實(shí)時(shí)性,實(shí)時(shí)監(jiān)控反映,實(shí)時(shí)通過(guò)AI去控制。

          雖然理論上可以計(jì)算出無(wú)人駕駛事故概率就是遠(yuǎn)遠(yuǎn)低于人類駕駛,但實(shí)際中還需要做進(jìn)一步驗(yàn)證。

          每天都會(huì)發(fā)生人為因素引起的交通事故,但對(duì)于大眾來(lái)說(shuō)并不算什么新聞。期待有一天,大眾對(duì)自動(dòng)駕駛出事故也有一個(gè)平常的心態(tài)。

          張?zhí)炖讋t指出沒(méi)有一個(gè)系統(tǒng)能夠百分之百的保證總是正常運(yùn)行,我們要做的是把出錯(cuò)的代價(jià)降到最小,核心的問(wèn)題是不要有人員的傷亡。

          在任何時(shí)候,自動(dòng)駕駛的安全性永遠(yuǎn)排在第一位。為了系統(tǒng)的安全性,付出再多代價(jià)也是需要的。

          圓桌討論的最后一部分,是每人分享一件行業(yè)中最感到意外的事。

          蘇奎峰:

          到頭來(lái)是新能源加速了自動(dòng)駕駛落地。

          彭進(jìn)展:

          震撼最大的是行業(yè)真的做到把安全員拿掉了。

          張?zhí)炖祝?/p>

          特斯拉投入巨大精力做數(shù)據(jù)驅(qū)動(dòng),造了世界上排行第五的超算機(jī)群來(lái)訓(xùn)練模型,這是中小型國(guó)家都做不到的。

          從那時(shí)開(kāi)始,大家明白了一個(gè)道理,自動(dòng)駕駛是個(gè)軍備競(jìng)賽。

          因?yàn)榭匆?jiàn),所以相信

          過(guò)去的一年,是復(fù)雜變化的一年。

          但前沿科技始終是社會(huì)發(fā)展的重要?jiǎng)恿Γ蔡N(yùn)藏著無(wú)比的機(jī)遇。AI大模型、自動(dòng)駕駛、生物計(jì)算等領(lǐng)域正在加速改變世界,前沿計(jì)算、新型儲(chǔ)能等方向新探索不斷涌現(xiàn)。

          與此同時(shí),前沿技術(shù)的落地也愈發(fā)如火如荼。新技術(shù)、新產(chǎn)品讓我們的生活越來(lái)越好,越來(lái)越有趣。

          不過(guò)一切也并非一帆風(fēng)順。

          量子位創(chuàng)始人兼CEO孟鴻表示,前沿科技的發(fā)展總是起起伏伏,發(fā)展的范式會(huì)改變,上升的道路會(huì)改變,但前進(jìn)的趨勢(shì)不會(huì)改變。

          今年到場(chǎng)的來(lái)賓,都是因?yàn)閷?duì)前沿科技有一份堅(jiān)定的相信,進(jìn)而選擇在這個(gè)方向上不斷推動(dòng)世界前進(jìn)。

          整場(chǎng)大會(huì)下來(lái)可以看到,他們今年交出的商業(yè)化落地答卷,在更深入現(xiàn)實(shí)的地方被交出。

          而這也只是今年諸多技術(shù)創(chuàng)新案例中的一隅。

          作為人工智能年度最佳落地參考,「2021人工智能年度評(píng)選」結(jié)果也已揭曉。在過(guò)去2個(gè)月時(shí)間里,共有數(shù)百家科技企業(yè)、機(jī)構(gòu)和個(gè)人報(bào)名參與評(píng)選。

          最終評(píng)選出50大領(lǐng)航企業(yè)、20大最具價(jià)值創(chuàng)業(yè)公司、30大創(chuàng)業(yè)領(lǐng)袖、20大技術(shù)領(lǐng)袖、10大最佳產(chǎn)品以及10大最佳解決方案等在內(nèi)人工智能領(lǐng)域年度獎(jiǎng)項(xiàng)。

          這些無(wú)一不在印證本次MEET智能未來(lái)大會(huì)主題:因?yàn)榭匆?jiàn),所以相信。

          希望讓更多人看到前沿科技的進(jìn)展和落地,讓更多人進(jìn)一步相信前沿科技背后蘊(yùn)藏的巨大價(jià)值。

          那么這一年,你看見(jiàn)了什么?從而又相信著什么?

          Ps,也許量子位最新發(fā)布的「2021人工智能年度評(píng)選」,可以給你參考,鏈接在此:https://mp.weixin.qq.com/s/E3wcXr3PA0uZAZ1N-lgThg。

          Pps,如果想回顧精彩內(nèi)容,回放鏈接在此!
          微吼:http://live.vhall.com/127740714
          微博:https://weibo.com/l/wblive/p/show/1022:2321324707747747987514
          百家號(hào):https://live.baidu.com/m/media/multipage/liveshow/index.html?room_id=5008651533
          CSDN:https://live.csdn.net/room/wl5875/tVtNmdeX
          斗魚(yú):https://v.douyu.com/show/85BAvqrrERB7G4Lm?ap=1

          — 完 —

          量子位 QbitAI · 頭條號(hào)簽約

          關(guān)注我們,第一時(shí)間獲知前沿科技動(dòng)態(tài)



          是現(xiàn)代量子化學(xué)的奠基人,也是分子生物學(xué)研究的開(kāi)拓者之一。憑借對(duì)量子力學(xué)原理和分子結(jié)構(gòu)的深刻理解,少壯得志、堪稱天才的鮑林以他非凡的刪繁就簡(jiǎn)和構(gòu)建模型的能力,一次次在化學(xué)和生物學(xué)難題上攻城略地,風(fēng)光無(wú)兩。然而盛名之后的他,卻因執(zhí)迷維生素C神話而成為醫(yī)學(xué)史上的笑談,其人生的最后25年令人唏噓不已……


          撰文 ∣ 何笑松(加州大學(xué)戴維斯醫(yī)學(xué)院退休教授)


          萊納斯·鮑林(Linus Pauling)出生于1901年,是20世紀(jì)最偉大的化學(xué)家之一,因其對(duì)化學(xué)鍵及分子結(jié)構(gòu)的一系列重要研究成果獲得1954年的諾貝爾化學(xué)獎(jiǎng)。鮑林也是20世紀(jì)五、六十年代最著名的和平主義活動(dòng)家,他堅(jiān)決反對(duì)核武器及一切形式的戰(zhàn)爭(zhēng),并因此在1963年獲得諾貝爾和平獎(jiǎng)。鮑林因此成為有史以來(lái)唯一單獨(dú)獲得兩項(xiàng)諾貝爾獎(jiǎng)的個(gè)人。

          但從1960年代開(kāi)始,頭戴兩頂諾獎(jiǎng)桂冠、正值事業(yè)和名譽(yù)巔峰期的鮑林卻一步一步地成為維生素C的最有力推手。這一轉(zhuǎn)變是如何發(fā)生的?

          維生素C神話的第一次登場(chǎng)


          鮑林的維生素情結(jié)始于1941年,當(dāng)時(shí)年僅40歲的鮑林得了腎病。在一位著名醫(yī)生的建議下,鮑林接受了當(dāng)時(shí)少有人用的低蛋白無(wú)鹽飲食療法,輔以維生素補(bǔ)充劑,病情得到控制。這一親身經(jīng)歷,為鮑林以維生素治病的觀念打下了根深蒂固的基礎(chǔ)。

          1950年代中期,作為當(dāng)代最偉大化學(xué)家之一的鮑林,逐漸形成了一套關(guān)于人類健康的綜合理論。他相信人的生命可被視為無(wú)數(shù)化學(xué)反應(yīng)的總和,其中最重要的是酶催化的產(chǎn)生能量的反應(yīng),導(dǎo)致細(xì)胞繁殖和遺傳復(fù)制的反應(yīng),大腦和神經(jīng)中的電化學(xué)反應(yīng),以及抗原-抗體反應(yīng)。如果這一切反應(yīng)都順利進(jìn)行,就意味著健康;哪一項(xiàng)反應(yīng)受阻或者停止了,就意味著疾病。要想實(shí)現(xiàn)理想的健康狀態(tài),就必須使所有的化學(xué)反應(yīng)都在最佳狀態(tài)下運(yùn)行,也就是所有的化學(xué)分子,包括營(yíng)養(yǎng)成分、催化劑及反應(yīng)產(chǎn)物,都處于適當(dāng)?shù)钠胶鉅顟B(tài)。鮑林為這種平衡造出一個(gè)詞匯“正分子”,意指“正確的分子,正確的數(shù)量”,以此為基礎(chǔ)的醫(yī)學(xué)就是“正分子醫(yī)學(xué)”,它著眼于將病人所需要的重要分子補(bǔ)充到最佳濃度,以消除疾病。

          1966年3月的一天,65歲的鮑林在紐約接受了一項(xiàng)科學(xué)成就獎(jiǎng)。他在頒獎(jiǎng)儀式上發(fā)表獲獎(jiǎng)感言時(shí),提到希望自己再活25年,以便看到幾項(xiàng)科學(xué)研究的結(jié)果。回到加州后,鮑林收到一封信,來(lái)自一個(gè)名叫斯通(Irwin Stone)的陌生人。斯通參加了紐約的頒獎(jiǎng)儀式,聽(tīng)到鮑林的愿望,于是他寫信建議鮑林像他一樣,每天服用3000毫克(3克)維生素C,這樣不僅再活25年不成問(wèn)題,而且可能還要長(zhǎng)的多。

          被鮑林稱為“生物化學(xué)家”的斯通是何許人?他在美國(guó)洛杉磯的一所脊椎推拿療法學(xué)院學(xué)過(guò)兩年化學(xué),后來(lái)從加州一所名為“唐斯巴赫大學(xué)”,未經(jīng)美國(guó)聯(lián)邦政府教育部認(rèn)證的野雞函授大學(xué)得到一個(gè)博士學(xué)位。斯通從來(lái)沒(méi)有發(fā)表過(guò)任何一篇科研論文,而著作等身的鮑林居然聽(tīng)信了他的建議,開(kāi)始服用大劑量維生素C,從每天500毫克,1克,直到18克,超過(guò)了美國(guó)食品和藥品管理局(FDA)推薦的成年人每日攝入量的200倍。鮑林發(fā)現(xiàn)這果然有效,他宣稱從來(lái)沒(méi)有自我感覺(jué)如此健康,如此精力旺盛,連年年令他備受折磨的感冒也不太發(fā)生了。1969年,鮑林開(kāi)始通過(guò)媒體宣傳,醫(yī)生應(yīng)該多多鼓勵(lì)公眾服用大劑量維生素C。

          針對(duì)鮑林的言論,有一位協(xié)助FDA制定維生素C推薦攝入量的臨床營(yíng)養(yǎng)學(xué)家致信鮑林,要求他提供證據(jù)。鮑林的答復(fù)是在1971年出版的《維生素C與普通感冒》,書(shū)中匯集了他找到的關(guān)于維生素C的健康效應(yīng)的研究結(jié)果,聲稱對(duì)于大多數(shù)人,每天服用1克維生素C,可以將感冒的發(fā)病率降低45%;而對(duì)有些人來(lái)說(shuō),劑量可能還要更大。一旦感冒的癥狀出現(xiàn),就應(yīng)該每小時(shí)服用半克至1克維生素C,連服幾個(gè)小時(shí);如果這樣的劑量還不見(jiàn)效,那就再加大到每天4至10克[1]

          鮑林的這本新書(shū)立即登上了全美暢銷書(shū)排行榜,激起了巨大反響。幾年不到,就有四分之一的美國(guó)人遵從鮑林的建議,服用巨量維生素C。1976年,這本書(shū)再版后改名為《維生素C與普通感冒及流感》[2],書(shū)中推薦的劑量更高了。

          不僅如此,鮑林在書(shū)中還建議為了保持“最佳健康狀態(tài)”,應(yīng)對(duì)感染及其它壓力,多數(shù)人每天應(yīng)服用至少2300毫克維生素C。在他后來(lái)出版的又一本面向大眾的暢銷書(shū)《怎樣活得更長(zhǎng)更好》[3]中,鮑林聲稱由于不同個(gè)體之間生物化學(xué)上的差異巨大,維生素C的每日最佳攝入量可以少至250毫克,多到20克以上,這樣才能達(dá)到許多哺乳動(dòng)物肝臟內(nèi)自行合成后釋放到血液中的維生素C 的水平。這是多少維生素C?以山羊?yàn)槔恢唤】档某赡晟窖蛎刻炷芎铣?3克維生素C,遭到壓力時(shí)還要高得多!

          鮑林對(duì)他的理論身體力行,自稱長(zhǎng)年每天服用12克維生素C,出現(xiàn)感冒癥狀時(shí)更是增加到40克!盡管主流醫(yī)學(xué)界的絕大多數(shù)醫(yī)生和營(yíng)養(yǎng)師反對(duì)鮑林的理論,并且指出長(zhǎng)期服用巨量維生素C可能引起慢性腹瀉及腎結(jié)石,千千萬(wàn)萬(wàn)的美國(guó)人還是狂熱地追隨鮑林的倡議,以身試藥。

          維生素C與感冒

          現(xiàn)代醫(yī)學(xué)的主流是循證醫(yī)學(xué),它強(qiáng)調(diào)任何醫(yī)療決策應(yīng)該以來(lái)自科學(xué)研究的最佳證據(jù)為基礎(chǔ),同時(shí)結(jié)合醫(yī)生的個(gè)人臨床實(shí)踐經(jīng)驗(yàn),并且考慮病人的價(jià)值觀和愿望。鮑林宣稱的巨量維生素C對(duì)于預(yù)防及治療感冒的奇效,究竟有何科學(xué)證據(jù)?

          任何科學(xué)證據(jù)的確立,必須服從一套嚴(yán)格的規(guī)則,也就是科學(xué)方法。簡(jiǎn)單地說(shuō),這是一套精心設(shè)計(jì)、可以區(qū)分因果關(guān)系和巧合關(guān)系的邏輯系統(tǒng),利用它對(duì)有效的實(shí)驗(yàn)進(jìn)行分析,才能為特定的醫(yī)學(xué)問(wèn)題提供科學(xué)答案。必須強(qiáng)調(diào)的是,并非所有的實(shí)驗(yàn)都符合條件。有效的實(shí)驗(yàn)必須是設(shè)計(jì)正確、數(shù)據(jù)采集可靠、統(tǒng)計(jì)分析無(wú)誤、結(jié)果解釋合理。有效實(shí)驗(yàn)的一個(gè)重要標(biāo)志是能被其他人重復(fù)進(jìn)行,而且得到相同結(jié)果。

          關(guān)于維生素C與感冒的關(guān)系,關(guān)鍵的問(wèn)題是兩個(gè):1. 大劑量維生素C能否預(yù)防感冒發(fā)生?2. 大劑量維生素C能否減輕感冒癥狀,縮短感冒病程?從1930年代維生素C被發(fā)現(xiàn),特別是實(shí)現(xiàn)工業(yè)化生產(chǎn)后,就有醫(yī)學(xué)研究人員多次研究過(guò)它對(duì)感冒的作用。大多數(shù)研究的結(jié)論是補(bǔ)充維生素C不能預(yù)防感冒;對(duì)于治療感冒,維生素C的作用充其量是略微減輕癥狀,而且并不需要鮑林提倡的高劑量[4]。鮑林的《維生素C與普通感冒》一書(shū)出版后,由于它的巨大影響,同時(shí)出于對(duì)鮑林的尊重,又有美國(guó)、加拿大及荷蘭的研究人員進(jìn)行了一系列研究,分別試驗(yàn)了不同劑量維生素C對(duì)于預(yù)防和治療感冒的作用,結(jié)論還是毫無(wú)效果。

          可是鮑林堅(jiān)定地認(rèn)為,根據(jù)他對(duì)同樣的試驗(yàn)結(jié)果作出的不同解釋,他是正確的,其他人都錯(cuò)了。他還提出每個(gè)人可以用如下方法自行確定合適的維生素C劑量:如果每天吃1克,一冬天得了兩次或者三次感冒,那么就應(yīng)該加大劑量試試;如果感冒的次數(shù)少于預(yù)期,那么就可以相信是維生素C起了作用。

          遺憾的是,這距離真正的科學(xué)方法何止十萬(wàn)八千里。不妨試想以下幾種可能發(fā)生的情況:

          其一,你記錯(cuò)了自己感冒的次數(shù),這將造成數(shù)據(jù)采集的錯(cuò)誤。

          其二,你去年在醫(yī)院工作,得過(guò)三次感冒。今年退休在家,同時(shí)開(kāi)始吃維生素C,只得了一次感冒。你相信這是因?yàn)槌跃S生素C預(yù)防了感冒,但更大的可能性是由于環(huán)境變化,你被感冒病毒感染的機(jī)會(huì)少了。如果是這樣的話,你吞下的維生素C和少患感冒就只是巧合。

          其三,你吃著維生素C,同時(shí)得了一場(chǎng)輕微的感冒。由于你對(duì)維生素C的信仰如此堅(jiān)定,因此下意識(shí)地決定不予理會(huì),這就是心理作用造成的安慰劑效應(yīng)。

          科學(xué)實(shí)驗(yàn)的設(shè)計(jì)必須能夠避免這些可能的誤差。為了防止記憶錯(cuò)誤,對(duì)實(shí)驗(yàn)對(duì)象必須密切跟蹤隨訪。為了消除巧合的影響,實(shí)驗(yàn)對(duì)象的數(shù)目要足夠大,隨訪期要足夠長(zhǎng)。為了避免安慰劑效應(yīng),實(shí)驗(yàn)必須采用雙盲法。具體做法是,募集一批受試者,隨機(jī)分派到實(shí)驗(yàn)組和對(duì)照組,以確保兩組人的遺傳背景、生活環(huán)境等情況盡可能相似。每一個(gè)受試者本人及其家人,以及為受試者提供試驗(yàn)藥物的研究人員,都不知道受試者被分在哪一組。有些研究甚至只用同卵雙胞胎作為受試者,將其中一人分入實(shí)驗(yàn)組,另一人分到對(duì)照組。尤其是同卵雙胞胎兒童,不僅遺傳基因完全相同,而且通常生活于同一家庭環(huán)境,對(duì)于臨床醫(yī)學(xué)實(shí)驗(yàn)的價(jià)值更高。研究人員給實(shí)驗(yàn)組每天服用不同劑量的維生素C,對(duì)照組服用外觀、味道等與維生素C相似的安慰劑,然后跟蹤觀察一段時(shí)間,比較兩組的流感發(fā)病率和發(fā)病后的癥狀嚴(yán)重程度和病程長(zhǎng)短。

          感冒臨床實(shí)驗(yàn)的一種做法是直接給自愿受試者接種感冒病毒。這種策略的好處是所有的受試者都接觸到相同的感冒病毒,發(fā)病率高而且病情較為一致,所需要的受試者人數(shù)較少。1967年和1973年,先后有研究人員進(jìn)行了這樣的實(shí)驗(yàn),給實(shí)驗(yàn)組每人每天服用3克維生素C,對(duì)照組服用安慰劑,所有受試者在鼻腔接種感冒病毒。結(jié)果發(fā)現(xiàn),兩組所有的人都得了感冒,嚴(yán)重程度沒(méi)有差別。

          另一種策略是觀察自然發(fā)生的感冒病例。這樣的研究在各國(guó)進(jìn)行過(guò)多次,每次涉及的受試者少則幾百人,多則幾千人。結(jié)果如何?沒(méi)有一次試驗(yàn)發(fā)現(xiàn)維生素C能顯著降低總的感冒發(fā)病率。有些試驗(yàn)發(fā)現(xiàn)維生素C的確能略微減輕癥狀,縮短病程(例如從平均5.8天縮短到5.5天),問(wèn)題是這樣幾個(gè)小時(shí)的差別有什么實(shí)際意義嗎?

          1975年發(fā)表的一項(xiàng)研究結(jié)果十分有趣,值得一提[5]。這次實(shí)驗(yàn)歷時(shí)9個(gè)月,一共有三百多名受試者參加,都是美國(guó)國(guó)立衛(wèi)生研究院(NIH)的工作人員。受試者被隨機(jī)分為四組:第一組自始至終每天服用安慰劑;第二組在感冒發(fā)生前服用安慰劑,發(fā)生感冒后每天服用3克維生素C;第三組在感冒發(fā)生前每天服用3克維生素C,發(fā)生感冒后改為安慰劑;第四組在感冒發(fā)生前后每天分別服用3克和6克維生素C。研究從九月份開(kāi)始,到次年五月份結(jié)束,包括了感冒高發(fā)的秋、冬、春三季。所有受試者都被告知這是一項(xiàng)采用雙盲對(duì)照法的臨床試驗(yàn),目的是研究維生素C對(duì)預(yù)防和治療感冒的作用,并且簽署了知情同意書(shū)。

          這次實(shí)驗(yàn)的設(shè)計(jì)百密一疏,出了一個(gè)紕漏:研究人員為了趕在秋季到來(lái)時(shí)開(kāi)始實(shí)驗(yàn),沒(méi)有把用膠囊封裝的安慰劑的味道調(diào)成和維生素C一樣的酸味。在研究過(guò)程中,陸續(xù)有一些受試者中途退出,尤其是服用安慰劑的對(duì)照組,退出的比例特別高。研究人員對(duì)此頓生疑竇,于是在9個(gè)月的研究結(jié)束后進(jìn)行了一項(xiàng)問(wèn)卷調(diào)查,發(fā)現(xiàn)大約一半的受試者禁不住好奇心的誘惑,打開(kāi)膠囊,憑著藥粉的味道,正確地猜出所吃的是維生素C還是安慰劑。分到安慰劑對(duì)照組的一些受試者覺(jué)得自己得不到服用維生素C的好處,干脆中途打了退堂鼓。

          由于有一半受試者不符合雙盲法的要求,研究人員只能將猜出自己吃了什么藥的受試對(duì)象挑出來(lái),單獨(dú)進(jìn)行分析。得到的結(jié)果令人吃驚:不知道自己分在哪一組、也就是符合實(shí)驗(yàn)設(shè)計(jì)的雙盲法的受試對(duì)象,得了感冒后如果服用安慰劑,平均病程是6.3天,如果服用維生素C,平均病程是6.7天,表明維生素C對(duì)縮短病程無(wú)效。而那些猜出自己分在哪一組的受試者,得了感冒后如果服用安慰劑,平均病程是8.6天,如果服用維C,平均病程只有4.7天。表面看來(lái),似乎維生素C將病程縮短了3.9天。但是如果將知道自己吃了什么的受試者與對(duì)此不知情的受試者比較,如果吃的是維生素C,前者的平均病程比后者短了2天;如果吃的是安慰劑,前者的平均病程比后者長(zhǎng)了2.3天!這一結(jié)果歪打正著地表現(xiàn)了安慰劑效應(yīng)的巨大影響:如果你相信吃下去的東西——維生素或者其它補(bǔ)品——有益健康,你就可能感覺(jué)它的確有效;如果你相信自己吃的是毫無(wú)治療作用的安慰劑,你甚至可能感覺(jué)病情變得更糟(稱為“反安慰劑效應(yīng)”),哪怕藥物的實(shí)際效果,無(wú)論是維生素C的正面效果還是安慰劑的負(fù)面效果,根本就不存在!

          1986年,澳大利亞悉尼大學(xué)的教授特拉斯韋(Truswell AS)在《新英格蘭醫(yī)學(xué)雜志》發(fā)文,回顧總結(jié)了自1970年以來(lái)進(jìn)行的22次關(guān)于維生素C與感冒的隨機(jī)雙盲法臨床研究結(jié)果。有12項(xiàng)研究發(fā)現(xiàn)維生素C對(duì)預(yù)防感冒發(fā)生、減輕癥狀、縮短病程無(wú)效。5項(xiàng)研究發(fā)現(xiàn)維生素C對(duì)預(yù)防沒(méi)有作用,對(duì)減輕癥狀有輕微作用,但在統(tǒng)計(jì)學(xué)上的差別不顯著。其余5項(xiàng)研究發(fā)現(xiàn)維生素C沒(méi)有預(yù)防作用,但可以縮短感冒病程,雖然程度有限但在統(tǒng)計(jì)學(xué)上的差別是顯著的。特拉斯韋教授的結(jié)論是:“維生素C對(duì)于預(yù)防感冒顯然沒(méi)有作用。”他同時(shí)承認(rèn),“有一些證據(jù)表明,維生素C對(duì)治療感冒有微弱的效果,但是……每天250毫克與1000毫克或者4000毫克的效果是一樣的。”[6]250毫克維生素C是什么概念??jī)杀戎兴SC就有那么多。如果只是想用維生素C來(lái)減輕感冒癥狀,犯得著冒著腹瀉和其它嚴(yán)重副作用的風(fēng)險(xiǎn),遵照鮑林的指示每天吞下幾克維生素C藥片嗎?

          但是鮑林認(rèn)為,巨量維生素不僅對(duì)感冒有奇效,還能治療癌癥。

          維生素C與癌癥

          1970年代,鮑林與一名英國(guó)腫瘤外科醫(yī)生卡梅隆(Ewan Cameron)合作,研究靜脈注射或者口服巨量維生素C對(duì)癌癥的治療作用。二人在1976年和1978年發(fā)表了兩篇論文[7, 8],報(bào)告了在100名晚期癌癥病人中的試驗(yàn)結(jié)果:接受每天10克巨量維生素C治療后,病人的平均存活期是1000名未服用維生素C病人的3至4倍。兩篇論文都發(fā)表在《美國(guó)科學(xué)院院報(bào)》。這是一份影響因子很高的學(xué)術(shù)期刊,但通常并不刊登有關(guān)臨床醫(yī)學(xué)試驗(yàn)的論文,而且有時(shí)受人詬病的一點(diǎn)是,科學(xué)院院士本人在《院報(bào)》上發(fā)表的有些論文,沒(méi)有經(jīng)過(guò)和非院士作者的論文同樣嚴(yán)格的同行審稿過(guò)程。

          除了治療晚期癌癥,鮑林還提出,服用維生素C可以預(yù)防癌癥。1979年,他在一篇文章中宣稱“我目前的估計(jì)是,從預(yù)防性地服用維生素C做起,單靠維生素C就可以把癌癥的發(fā)病率和死亡率都降低75%。”[9]

          NIH 癌癥研究所的癌癥治療臨床試驗(yàn)分部主任杜伊斯(William DeWys)檢查了鮑林和卡梅隆的實(shí)驗(yàn)設(shè)計(jì),發(fā)現(xiàn)存在嚴(yán)重的缺陷[10]。維生素C治療組完全由卡梅隆的病人構(gòu)成,對(duì)照組則是其他醫(yī)生的病人,這兩組病人的選擇標(biāo)準(zhǔn)不一致,所以也就沒(méi)有可比性。實(shí)驗(yàn)組的病人存活期長(zhǎng),很可能是由于這組病人在實(shí)驗(yàn)開(kāi)始前的病情就比對(duì)照組輕。

          為了驗(yàn)證鮑林和卡梅隆所發(fā)表的結(jié)果,美國(guó)梅奧醫(yī)學(xué)中心在1978年進(jìn)行了一項(xiàng)前瞻性雙盲對(duì)照試驗(yàn), 受試者為晚期肺癌或消化道癌癥患者,所有病人都經(jīng)過(guò)腫瘤組織活檢,證實(shí)其病情已經(jīng)不再適合任何手術(shù)、化療或放療。受試者被隨機(jī)分為兩組,實(shí)驗(yàn)組每天口服10克維生素C,對(duì)照組口服味道和維生素C相似的安慰劑。試驗(yàn)結(jié)果于1979年以“高劑量維生素C療法對(duì)晚期癌癥無(wú)效”為題,在《新英格蘭醫(yī)學(xué)雜志》發(fā)表,文中報(bào)告實(shí)驗(yàn)組和對(duì)照組的平均存活期都是7周左右,存活最久的一個(gè)病人來(lái)自對(duì)照組[11]

          梅奧中心的研究結(jié)果發(fā)表后,鮑林投書(shū)《新英格蘭醫(yī)學(xué)雜志》,聲稱梅奧團(tuán)隊(duì)的研究對(duì)象都接受過(guò)化療,免疫功能已經(jīng)受損,因此不能從維生素C療法獲益。盡管梅奧團(tuán)隊(duì)先前已經(jīng)做過(guò)研究,知道所用的化療對(duì)免疫功能的影響并不嚴(yán)重,但他們對(duì)鮑林的批評(píng),以及其他研究人員提出的建議還是認(rèn)真對(duì)待,又進(jìn)行了兩次試驗(yàn),其中一次所用的受試者沒(méi)有接受過(guò)任何化療[12, 13]。前后三次試驗(yàn)一共包括三百多名病人,三次試驗(yàn)的結(jié)果一樣,實(shí)驗(yàn)組和對(duì)照組的平均存活期沒(méi)有顯著差別,高劑量維生素C療法對(duì)晚期癌癥無(wú)效。

          可是此時(shí)的鮑林已經(jīng)接受不了任何與他的觀點(diǎn)不一致的研究結(jié)果,哪怕這樣的結(jié)果來(lái)自他最信任的助手。

          1973年,鮑林在北加州斯坦福大學(xué)附近創(chuàng)建了“正分子醫(yī)學(xué)研究所”,自任所長(zhǎng)兼董事會(huì)主席,他的弟子羅賓遜(Arthur Robinson)任副所長(zhǎng)。羅賓遜博士是鮑林在加州大學(xué)圣迭戈分校任訪問(wèn)教授時(shí)物色到的一名優(yōu)秀學(xué)生,后來(lái)長(zhǎng)期擔(dān)任鮑林的助理,輔佐他的研究工作。研究所成立一年以后,改名為“鮑林科學(xué)及醫(yī)學(xué)研究所”,羅賓遜成為正所長(zhǎng)。研究所的主要課題就是為鮑林的維生素C理論提供實(shí)驗(yàn)證據(jù)。

          1977年,羅賓遜用小鼠進(jìn)行了一項(xiàng)實(shí)驗(yàn),研究維生素C對(duì)癌癥的作用。所用的是一種特別的小鼠,沒(méi)有毛發(fā),皮膚裸露,受紫外線照射后容易誘發(fā)皮膚癌。他給一半小鼠喂食大劑量維生素C,按體重?fù)Q算相當(dāng)于人類的每天5至10克,另一半不喂維C,作為對(duì)照。結(jié)果發(fā)現(xiàn),維C不僅沒(méi)有降低癌癥發(fā)病率,反而使皮膚癌的發(fā)病率提高了一倍!不僅如此,對(duì)于已經(jīng)形成的腫瘤,每日相當(dāng)于1至5克人類劑量的維C可以促進(jìn),而不是抑制腫瘤生長(zhǎng),只有將維C的劑量加大到相當(dāng)于每天100克的人類劑量時(shí),才能抑制腫瘤的生長(zhǎng),而這樣的劑量已經(jīng)接近維C對(duì)小鼠的致死劑量了!

          羅賓遜知道鮑林夫婦二人長(zhǎng)年服用巨量維生素C,這不由得令他擔(dān)憂。豈料鮑林拒絕承認(rèn)他的數(shù)據(jù),而且不顧羅賓遜已經(jīng)追隨他16年的情誼,下令董事會(huì)將羅賓遜解雇,他的實(shí)驗(yàn)小鼠被殺死,實(shí)驗(yàn)記錄被封存,其中一部分被銷毀。鮑林還公開(kāi)宣稱羅賓遜的研究工作不夠?qū)I(yè),數(shù)據(jù)不可靠。羅賓遜忍無(wú)可忍,一紙?jiān)V狀將鮑林和他的研究所告上法庭。1983年,訴案以庭外和解告終,羅賓遜得到57.5萬(wàn)美元的賠償,其中42.5萬(wàn)作為他所遭口頭及書(shū)面誹謗的補(bǔ)償[14]

          維生素C與其它一些維生素之所以是維持我們身體健康所必需的營(yíng)養(yǎng)成分,是由于它們除了具有協(xié)助細(xì)胞能量代謝的輔酶作用外,還有抗氧化劑的作用。吃進(jìn)體內(nèi)的食物在細(xì)胞內(nèi)通過(guò)氧化反應(yīng)燃燒后才能產(chǎn)生能量。其它一些進(jìn)入體內(nèi)的有害物質(zhì)也是通過(guò)氧化反應(yīng)轉(zhuǎn)化為無(wú)毒的產(chǎn)品被排出體外。但是氧化反應(yīng)能產(chǎn)生一些稱為自由基的分子,它們因失去電子而帶有正電荷,能與帶有負(fù)電荷的細(xì)胞膜、DNA、蛋白質(zhì)等成分結(jié)合,對(duì)這些細(xì)胞組分造成損害,包括可能致癌的基因突變。自由基還能損傷向心臟供血的血管,誘發(fā)冠心病。而維生素C以及維生素A、E,Ω-3 脂肪酸(魚(yú)油的主要成分)等具有抗氧化劑作用的分子能夠給自由基提供所缺少的電子,消除它們對(duì)細(xì)胞組分的損害。這就是一般認(rèn)為多吃水果蔬菜魚(yú)類等健康食品有助于延緩衰老,防止癌癥和心血管病的一個(gè)原因;也正因如此,抗氧化功能成為許多保健營(yíng)養(yǎng)品最大的賣點(diǎn)。

          鮑林關(guān)于大劑量維生素C抗癌的理論,其邏輯倒也清楚:既然食物中的維生素C等抗氧化劑有助于防癌,那就是多多益善,應(yīng)該大量補(bǔ)充。但他忽略了一個(gè)重要的事實(shí):自由基既能對(duì)細(xì)胞造成損害,又是免疫系統(tǒng)消滅癌變細(xì)胞以及致病微生物的一大利器。維持健康的關(guān)鍵在于保持細(xì)胞內(nèi)的氧化與抗氧化反應(yīng)的平衡,長(zhǎng)期服用超大劑量的抗氧化劑有可能破壞這種平衡,造成嚴(yán)重后果。在羅賓遜之后,又有各國(guó)研究人員進(jìn)行了多次大規(guī)模的調(diào)查和研究,對(duì)象總數(shù)超過(guò)20萬(wàn)人,發(fā)現(xiàn)服用巨量維生素(包括維C)的確增加了罹患多種癌癥的風(fēng)險(xiǎn)[15]

          維生素C與心臟病

          鮑林在他1986年出版的《怎樣活得更長(zhǎng)更好》一書(shū)中宣稱,巨量維生素能“改進(jìn)你的總體健康狀況……增加你生活的樂(lè)趣,幫助控制心臟病、癌癥及其它疾病,延緩衰老過(guò)程。”

          針對(duì)維生素C與心臟病的關(guān)系,1992年,91歲高齡的鮑林與德國(guó)醫(yī)生拉思(Matthias Rath)合作,在一份不受主流醫(yī)學(xué)界承認(rèn),不被美國(guó)國(guó)立醫(yī)學(xué)圖書(shū)館的MEDLINE 數(shù)據(jù)庫(kù)收錄的刊物《正分子醫(yī)學(xué)雜志》發(fā)表了一篇文章,題為《一項(xiàng)終將導(dǎo)致消除人類致命心血管病的統(tǒng)一理論》 [16]

          根據(jù)鮑林的這個(gè)理論,大約4千萬(wàn)年前,人類的遠(yuǎn)祖生活在溫暖的熱帶地區(qū),以植物為主食,各種植物性食物中富含維生素C,不需要在體內(nèi)自行合成,結(jié)果導(dǎo)致一個(gè)合成維C的關(guān)鍵酶——L-古洛糖酸內(nèi)酯氧化酶的基因發(fā)生突變,永遠(yuǎn)失去了像其它動(dòng)物一樣自行合成維C的能力。后來(lái)隨著棲息地的遷移以及地球氣候變冷、冰川期到來(lái),來(lái)自食物的維生素C營(yíng)養(yǎng)成分大幅度減少,致使壞血病的發(fā)病率提高。而壞血病的主要特征是膠原蛋白、彈性蛋白等結(jié)締組織的主要成分的合成途徑受損,使血管壁的強(qiáng)度減弱,容易破裂,導(dǎo)致出血及死亡。壞血病因此成為冰川期對(duì)人類祖先的進(jìn)化影響最大的自然選擇壓力。這種選擇壓力使得能促進(jìn)動(dòng)脈粥樣硬化的遺傳變異成為有利于生存的因素,因?yàn)閯?dòng)脈粥樣硬化是由于血液中的低密度脂蛋白(壞膽固醇)、脂蛋白a等成分在血管內(nèi)壁沉積,形成斑塊,增加了血管壁的厚度及強(qiáng)度,從而減少了壞血病造成的出血和死亡。換句話說(shuō),動(dòng)脈粥樣硬化是在人類祖先的進(jìn)化過(guò)程中,通過(guò)自然選擇得到的在缺乏維生素C時(shí)有利于生存的性狀;動(dòng)脈粥樣硬化造成的心血管病,則是這種選擇給今天的人類留下的健康隱患。

          盡管今天的人類已經(jīng)不幸地繼承了那些能促進(jìn)動(dòng)脈粥樣硬化的遺傳基因,好在鮑林告訴我們,維生素C是對(duì)抗不利遺傳基因的救星,它幾乎對(duì)已知的任何一種心血管病的危險(xiǎn)因素都有補(bǔ)救作用。維生素C能在代謝水平上抑制脂蛋白a的合成,促進(jìn)膽固醇轉(zhuǎn)化為膽酸后經(jīng)由膽管排出,從而減少血管斑塊的形成和心血管病的發(fā)生。但是要使維生素C的功效得以充分發(fā)揮,補(bǔ)充的量就必須達(dá)到人類的遠(yuǎn)祖在失去合成維C能力之前,體內(nèi)每天能制造的數(shù)量——10至20克。鮑林在文中沒(méi)有說(shuō)明這個(gè)數(shù)據(jù)從何而來(lái),大概是根據(jù)已知的今天一些哺乳動(dòng)物合成維生素的能力推測(cè)的。

          文章的結(jié)尾總結(jié)道:“鑒于缺乏維生素C是人類心血管病的共同原因,補(bǔ)充維生素C就是這一疾病的普適療法。現(xiàn)有的流行病學(xué)及臨床研究結(jié)果相當(dāng)可信地證明了這一點(diǎn)。這一理論在臨床上進(jìn)一步證實(shí)后,心血管病將不再是我們這一代以及未來(lái)人類的死亡原因。”

          《統(tǒng)一理論》一文發(fā)表兩年后,1994年8月19日,鮑林因前列腺癌與世長(zhǎng)辭。去世之前他接受過(guò)放射線治療。鮑林宣稱長(zhǎng)年服用的維生素C將他的癌癥推遲了20年。這是個(gè)無(wú)法驗(yàn)證的假設(shè),自然不足為憑。

          鮑林在他這最后一篇重要文章中言之鑿鑿地提到的實(shí)驗(yàn)證據(jù)是什么?

          1990年,鮑林和拉思曾在《美國(guó)科學(xué)院院報(bào)》發(fā)表一篇研究論文[17],報(bào)告豚鼠的飼料中如果缺少維生素C,就會(huì)造成動(dòng)脈粥樣硬化,而且血管斑塊中含有脂蛋白a。如果給豚鼠按每千克體重每天補(bǔ)充40毫克維生素C(大約相當(dāng)于2至3克的人類劑量),就可以防止脂蛋白a在血管壁沉積、造成粥樣硬化。鮑林據(jù)此推斷,維生素C對(duì)人類也有同樣效果。

          雖然豚鼠和人一樣不能自行合成維生素C,豚鼠畢竟不同于人類。不管鮑林的統(tǒng)一理論看上去多么漂亮,他所描繪的利用維生素C來(lái)永遠(yuǎn)消除致命心血管病的美好愿景能否實(shí)現(xiàn),歸根結(jié)底還要靠人體研究來(lái)檢驗(yàn)。

          2016年,美國(guó)康涅狄格州立大學(xué)的兩位學(xué)者回顧總結(jié)了自1993年以來(lái)發(fā)表的關(guān)于維生素C與心臟健康的研究結(jié)果,包括7項(xiàng)觀察性的流行病學(xué)調(diào)查和6項(xiàng)隨機(jī)雙盲法臨床試驗(yàn)。得到的發(fā)現(xiàn)是:維生素C的缺乏與心血管疾病死亡率的提高相關(guān);但是對(duì)于補(bǔ)充維生素C能否降低心血管病的發(fā)病率和死亡率,證據(jù)依舊不足。許多研究沒(méi)有發(fā)現(xiàn)補(bǔ)充維生素C和心血管病的任何關(guān)聯(lián),少數(shù)研究發(fā)現(xiàn)補(bǔ)充維生素C略有益處,但值得注意的是,也有一些研究發(fā)現(xiàn)維生素C補(bǔ)充劑增加了心血管疾病的風(fēng)險(xiǎn),而且劑量不過(guò)是每天1克,只有已被確認(rèn)的可耐受最高攝入量(2克)的一半。鑒于現(xiàn)有的研究結(jié)果不完全一致,兩位作者審慎地建議,對(duì)此還需要做進(jìn)一步的研究[18]

          九泉之下的鮑林如若有知,還有耐心繼續(xù)等待嗎?

          鮑林的遺產(chǎn)

          鮑林的一生為人類留下的遺產(chǎn)是極為豐富而復(fù)雜的。天才的鮑林是將量子力學(xué)引入化學(xué)、將分子結(jié)構(gòu)引入醫(yī)學(xué)、將蛋白質(zhì)的氨基酸組分變化引入進(jìn)化生物學(xué)的第一人。他是反對(duì)核武器和一切形式戰(zhàn)爭(zhēng)的堅(jiān)強(qiáng)斗士。而晚年的鮑林則成為年銷售額320億美元的維生素保健品行業(yè)的精神教父。

          是什么因素使得曾經(jīng)依靠嚴(yán)謹(jǐn)深入的研究和思辨,腳踏科學(xué)證據(jù)的基石步步攀登,征服了一座又一座科學(xué)高峰的鮑林,轉(zhuǎn)變?yōu)槊鎸?duì)科學(xué)證據(jù)仍拒絕承認(rèn)錯(cuò)誤、一意孤行的鮑林?

          一種解釋是鮑林在他的科研生涯中,學(xué)術(shù)上曾經(jīng)多次遭遇到強(qiáng)烈的反對(duì)意見(jiàn),而最終被證明為錯(cuò)誤的都是對(duì)方。久而久之,他終于形成了自己永遠(yuǎn)正確的潛意識(shí)。

          鮑林的同行,同為諾貝爾化學(xué)獎(jiǎng)得主的佩魯茨(Max Perutz)在高度贊譽(yù)鮑林的成就后,這樣評(píng)論道:“(維生素C)竟然成為鮑林最后25年中關(guān)心的頭等大事,使他作為化學(xué)家的崇高聲望受損,實(shí)在是個(gè)悲劇。這也許是由于他最大的弱點(diǎn):虛榮心。換成愛(ài)因斯坦,假如有人對(duì)他提出不同意見(jiàn),他會(huì)仔細(xì)思考,發(fā)現(xiàn)自己錯(cuò)了,會(huì)很高興地改正,因?yàn)檫@使他避免了失誤。而鮑林則永遠(yuǎn)不會(huì)承認(rèn)自己的錯(cuò)誤。” 佩魯茨隨后披露,他讀了鮑林關(guān)于蛋白質(zhì)α-螺旋的論文后,發(fā)現(xiàn)其中一處計(jì)算有誤,就向鮑林指出,還以為鮑林會(huì)為此高興,豈料鮑林不但不表示感謝,反而憤怒地加以反擊,“因?yàn)樗^不能忍受別人發(fā)現(xiàn)了被他自己遺漏的東西。”[15]

          1954年諾貝爾化學(xué)獎(jiǎng)?lì)C獎(jiǎng)儀式的當(dāng)天晚上,幾百名瑞典大學(xué)生手持火炬游行,祝賀鮑林成為新的諾獎(jiǎng)得主。鮑林應(yīng)邀發(fā)表演說(shuō):“作為老一輩人,我想給你們一點(diǎn)忠告,應(yīng)該怎樣對(duì)待長(zhǎng)輩。”他清澈的聲音在廣場(chǎng)上回蕩,“當(dāng)一個(gè)年長(zhǎng)的大人物對(duì)你說(shuō)話時(shí),認(rèn)真恭敬地聽(tīng),但別相信他。除了你自己的智慧,不要信任其它任何東西。一個(gè)老人,不管是白頭發(fā)或者沒(méi)頭發(fā),哪怕他得過(guò)諾貝爾獎(jiǎng),也可能是錯(cuò)的。你們必須永遠(yuǎn)保持懷疑,永遠(yuǎn)獨(dú)立思考。”學(xué)子們報(bào)以雷鳴般的掌聲和歡呼。

          當(dāng)年,鮑林就是憑借這種懷疑一切、不迷信權(quán)威的批判精神,開(kāi)辟了化學(xué)和分子生物學(xué)研究的新天地。

          今天,在我們不假思索地吞下幾克維生素C,或者一把其它保健營(yíng)養(yǎng)品前,是不是也應(yīng)該遵照鮑林的建議,先問(wèn)幾個(gè)為什么,做一番獨(dú)立的研究和思考?


          主要參考資料

          1. US National Library of Medicine. Profiles in Science: Linus Pauling. https://profiles.nlm.nih.gov/spotlight/mm.

          2. OSU Libraries. Linus Pauling Online. http://scarc.library.oregonstate.edu/digitalresources/pauling/.


          其他參考文獻(xiàn)

          [1] Pauling L. Vitamin C and the Common Cold. San Francisco: WH Freeman, 1976.

          [2] Pauling L. Vitamin C, the Common Cold and the Flu. San Francisco: WH Freeman, 1976.

          [3] Pauling L. How to Live Longer and Feel Better. New York: WH Freeman, 1986.

          [4] Marshall CW. 2002. Vitamin C: Do High Doses Prevent Colds? https://www.quackwatch.org/01QuackeryRelatedTopics/DSH/colds.html)

          [5] Karlowski TR et al. Ascorbic acid and the common cold: A prophylactic and therapeutic trial. 1975. JAMA 231:1038-42.

          [6] Truswell AS. Ascorbic acid (letter). N Engl J Med. 1986. 315:709.

          [7] Cameron E & Pauling L. Supplemental ascorbate in the supportive treatment of cancer: Prolongation of survival times in terminal human cancer. Proc Natl Acad Sci USA. 1976. 73: 3685-9.

          [8] Cameron E & Pauling L. Supplemental ascorbate in the supportive treatment of cancer: reevaluation of prolongation of survival times in terminal human cancer. Proc Natl Acad Sci USA 1978. 75: 4538-42.

          [9] Pauling L. On cancer and vitamin C. Prevention 1979. 31: 54.

          [10] DeWys WD. How to evaluate a new treatment for cancer. Your Patient and Cancer 1982. 2: 31-6.

          [11] Creagan ET et al. Failure of high-dose vitamin C (ascorbic acid) therapy to benefit patients with advanced cancer. A controlled trial. N Engl J Med. 1979. 301: 687-90.

          [12] Moertel CG et al. High-dose vitamin C versus placebo in the treatment of patients with advanced cancer who have had no prior chemotherapy. A randomized double-blind comparison. N Engl J Med. 1985. 312: 137-41.

          [13] Tschetter L et al. A community-based study of vitamin C (ascorbic acid) in patients with advanced cancer. Proceedings of the American Society of Clinical Oncology. 1983. 2: 92.

          [14] Barrett S. High Doses of Vitamin C Are Not Effective as a Cancer Treatment. 2011. https://www.quackwatch.org/01QuackeryRelatedTopics/Cancer/c.html

          [15] Offit PA. Pandora’s Lab. Washington DC: National Geographic, 2017.

          [16] Rath M & Pauling L. A Unified Theory of Human Cardiovascular Disease Leading the Way to the Abolition of This Disease as a Cause for Human Mortality. Journal of Orthomolecular Medicine. 1992. 7: 5-12.

          [17] Rath M & Pauling L. Immunological evidence for the accumulation of lipoprotein(a) in the atherosclerotic lesion of the hypoascorbemic guinea pig. Proc Natl Acad Sci USA. 1990. 87: 9388-90.

          [18] Moser MA & Chun OK. Vitamin C and Heart Health: A Review Based on Findings from Epidemiologic Studies. Int J Mol Sci. 2016 17(8). pii: E1328. doi: 10.3390/ijms17081328.

          特 別 提 示

          1. 進(jìn)入『返樸』微信公眾號(hào)底部菜單“精品專欄“,可查閱不同主題系列科普文章。

          2. 『返樸』開(kāi)通了按月檢索文章功能。關(guān)注公眾號(hào),回復(fù)四位數(shù)組成的年份+月份,如“1903”,可獲取2019年3月的文章索引,以此類推。

          版權(quán)說(shuō)明:歡迎個(gè)人轉(zhuǎn)發(fā),任何形式的媒體或機(jī)構(gòu)未經(jīng)授權(quán),不得轉(zhuǎn)載和摘編。轉(zhuǎn)載授權(quán)請(qǐng)?jiān)凇阜禈恪刮⑿殴娞?hào)內(nèi)聯(lián)系后臺(tái)。

          《返樸》,科學(xué)家領(lǐng)航的好科普。國(guó)際著名物理學(xué)家文小剛與生物學(xué)家顏寧共同出任總編輯,與數(shù)十位不同領(lǐng)域一流學(xué)者組成的編委會(huì)一起,與你共同求索。關(guān)注《返樸》(微信號(hào):fanpu2019)參與更多討論。二次轉(zhuǎn)載或合作請(qǐng)聯(lián)系返樸公眾號(hào)后臺(tái)。

          開(kāi)發(fā)者,在后端僅提供原始數(shù)據(jù)集的情況下,如何讓所有搜索邏輯都在前端完成?不僅如此,還要能夠?qū)崿F(xiàn)預(yù)測(cè)用戶輸入、忽略錯(cuò)別字輸入、快速自動(dòng)補(bǔ)齊等智能功能?本文的作者就深入 JavaScript 技術(shù)特性,談一談 React、性能優(yōu)化以及多線程那些事兒。



          作者 | Leo Fabrikant

          譯者 | 彎月,責(zé)編 | 郭芮

          出品 | CSDN(ID:CSDNnews)

          以下為譯文:



          第一篇 問(wèn)題闡述


          我有一個(gè)看似很簡(jiǎn)單的任務(wù):“有一個(gè)從后端檢索的數(shù)據(jù)集,其中包含13,000個(gè)數(shù)據(jù)項(xiàng),每一項(xiàng)都是冗長(zhǎng)羅嗦的名稱(科學(xué)組織)。使用這些數(shù)據(jù)創(chuàng)建一個(gè)帶自動(dòng)補(bǔ)齊功能的搜索欄。”

          你也不覺(jué)得很難,對(duì)不對(duì)?

          難點(diǎn)1:

          不能使用后端。后端只能提供原始的數(shù)據(jù)集,所有搜索邏輯都必須在前端完成。

          難點(diǎn)2:

          開(kāi)發(fā)人員(我):“這些組織名稱這么長(zhǎng),需要花點(diǎn)心思。如果我們只是運(yùn)行簡(jiǎn)單的字符串匹配,而且用戶可能會(huì)輸錯(cuò)或出現(xiàn)拼寫錯(cuò)誤,那么就很難搜索到任何結(jié)果。”

          客戶:“你說(shuō)的對(duì),我們必須加入一些智能的功能,預(yù)測(cè)用戶的輸入,忽略輸入的錯(cuò)別字。”

          注意:一般情況下,我不建議你在未經(jīng)項(xiàng)目經(jīng)理同意下,提示客戶沒(méi)有提到的復(fù)雜功能!這種情況稱為特征蔓延(feature creep)。在上述例子中,只是恰巧我一個(gè)人負(fù)責(zé)這個(gè)合同,我有足夠的精力,所以我認(rèn)為這是一個(gè)有趣的挑戰(zhàn)。

          難點(diǎn)3:

          這是最大的難點(diǎn)。我選擇的智能(也稱為“模糊”)搜索引擎非常慢……

          隨著搜索詞的長(zhǎng)度加長(zhǎng),這個(gè)搜索算法庫(kù)的搜索時(shí)間會(huì)迅速增加。此外,看看下面這個(gè)龐大的列表,里面的數(shù)據(jù)項(xiàng)極其冗長(zhǎng),用戶需要輸入一個(gè)很長(zhǎng)的搜索詞才能出現(xiàn)自動(dòng)補(bǔ)齊提示。別無(wú)他法,搜索引擎跟不上用戶的打字速度,這個(gè)UI可能會(huì)廢掉。




          我不知道是不是因?yàn)槲疫x擇的這個(gè)搜索算法庫(kù)太過(guò)糟糕,我也不知道是不是因?yàn)樗小澳:彼阉魉惴ǘ际沁@樣的情形。但幸運(yùn)的是,我沒(méi)有費(fèi)心去尋找其他選擇。

          盡管上述難點(diǎn)大多數(shù)是我自己強(qiáng)加上去的,但我依然決定堅(jiān)持到底,努力優(yōu)化這種實(shí)現(xiàn)。雖然我知道這可能不是最佳策略,但是這個(gè)項(xiàng)目的情況允許我這么做,結(jié)果將說(shuō)明一切,最重要的是,對(duì)我來(lái)說(shuō)這是一次絕佳的學(xué)習(xí)體驗(yàn)和成長(zhǎng)的機(jī)會(huì)。



          第二篇 問(wèn)題剖析


          在第一個(gè)實(shí)現(xiàn)中,我使用了UI的react-autocomplete和react-virtualized庫(kù)。

          render () {
           return (
           <Autocomplete
           value={this.state.searchTerm}
           items={this.getSearchResults()}
           renderMenu={this.reactVirtualizedList}
           renderItem={this.renderItem}
           getItemValue={ item => item.name }
           onChange={(e, value) => this.setState({searchTerm: value})}
           />
           )
           }
          


          Autocomplete組件需要傳遞以下幾項(xiàng):value屬性,需要傳入輸入框中的searchTeam;items屬性,傳入搜索結(jié)果;以及renderMenu函數(shù),該函數(shù)將搜索結(jié)果列表傳遞給react-vertualized。

          react-virtualized能夠很好地處理大型列表(它只會(huì)渲染列表顯示在屏幕上的一小部分,只有滾動(dòng)列表時(shí)才會(huì)更新)。考慮到我們需要渲染的組件并不多,我認(rèn)為應(yīng)該不會(huì)有太嚴(yán)重的性能問(wèn)題。

          更新操作的聲明周期也很簡(jiǎn)單:

          • 用戶輸入'a'
          • Autocomplete的onChange處理函數(shù)觸發(fā)一次渲染,此時(shí)this.state.searchTeam = 'a'
          • 該渲染會(huì)調(diào)用getSearchResults方法,在這個(gè)方法中,搜索引擎使用'a'作為搜索關(guān)鍵字計(jì)算搜索結(jié)果,然后將結(jié)果傳遞給react-virtualized負(fù)責(zé)渲染。


          getSearchResults = () => {
           const {searchTerm} = this.state;
           return searchTerm ? this.searchEngine.search(searchTerm) : []
           // searchEngine.search is the expensive search algorithm
          };
          


          我們來(lái)看看結(jié)果如何:




          哎呀……很糟。在按住刪除鍵時(shí)的的確確能感覺(jué)到UI的停頓,因?yàn)殒I盤觸發(fā)delete事件太快了。

          不過(guò)至少模糊搜索好用了:'anerican'正確地解釋成了'American'。但隨著搜索關(guān)鍵字的加長(zhǎng),兩個(gè)元素(輸入框和搜索結(jié)果)的渲染過(guò)程完全跟不上用戶輸入的速度,延遲非常大。

          盡管我們的搜索算法的確很慢,但如此大的延遲并不是由于單次搜索時(shí)間太長(zhǎng)導(dǎo)致的。這里還有另外一個(gè)現(xiàn)象需要理解:我們管它叫UI阻塞。理解這個(gè)現(xiàn)象需要深入了解Chrome的DevTools性能評(píng)測(cè)工具。

          性能評(píng)測(cè)

          可能你不熟悉這個(gè)工具,但是你要知道,熟練使用性能評(píng)測(cè)工具是深入理解JavaScript的最好方式。這不僅因?yàn)樗芴峁┯杏玫男畔湍憬鉀Q各種問(wèn)題,而且按照時(shí)間顯示出JavaScript的執(zhí)行過(guò)程能夠幫助你更好地理解好的UI、React、JavaScript事件循環(huán)、同步異步執(zhí)行等概念。

          在下面每一節(jié),我都會(huì)給出性能分析過(guò)程,以及從這些過(guò)程中推斷出的有趣的結(jié)論。這些數(shù)據(jù)可能會(huì)讓你眼花繚亂,但我會(huì)盡力給出合理的解釋!

          首先評(píng)測(cè)一下在Autocomplete中按下兩個(gè)鍵時(shí)的情況:



          X軸:時(shí)間,Y軸:按照類型排列的事件(用戶輸入、主線程函數(shù)調(diào)用)


          理解基本的序列非常重要:

          首先是用戶的鍵盤輸入(Key Characer)。這些輸入在JavaScript的主線程上觸發(fā)了Event(keypress)事件,該事件又觸發(fā)了我們的onChange處理函數(shù),該函數(shù)會(huì)調(diào)用setState(圖上看不見(jiàn),因?yàn)樗×耍奈恢迷谡麄€(gè)棧的最開(kāi)頭附近)。這一系列動(dòng)作標(biāo)志著重新計(jì)算的開(kāi)始,計(jì)算setState對(duì)組件會(huì)產(chǎn)生何種影響。這一過(guò)程稱為更新,或者叫做重新渲染,它會(huì)調(diào)用幾個(gè)React生命周期方法,其中就包括render。這一切都發(fā)生在一個(gè)執(zhí)行棧(有時(shí)稱為“調(diào)用棧”或簡(jiǎn)稱為“棧”),在圖中由每個(gè)Event (keypress)下方豎直排列的框表示。每個(gè)框都是執(zhí)行棧中的一次函數(shù)調(diào)用。

          這里不要被render這個(gè)詞誤導(dǎo)了。React的渲染并不僅僅是在屏幕上繪制。渲染只是React用來(lái)計(jì)算被更新的元素應(yīng)當(dāng)如何顯示的過(guò)程。如果仔細(xì)查看第二個(gè)Event (keypress),就會(huì)發(fā)現(xiàn)在Event (keypress)框的外面有個(gè)小得幾乎看不見(jiàn)的綠條。放大一些就能看到這是對(duì)瀏覽器繪制的調(diào)用:




          這才是UI更新被真正繪制到屏幕上,并在顯示器上顯示新幀的過(guò)程。而且,第一個(gè)Event (keypress)之后沒(méi)有繪制,只有第二個(gè)后面才有。

          這說(shuō)明,瀏覽器繪制(外觀上的更新)并不一定會(huì)在Event (keypress)事件發(fā)生并且React完成更新之后發(fā)生。

          原因是JavaScript的事件循環(huán)和JavaScript對(duì)于任務(wù)隊(duì)列的優(yōu)先級(jí)處理。在React結(jié)束計(jì)算并將更新寫入DOM之后(稱為提交階段,發(fā)生在每個(gè)執(zhí)行棧末尾的地方),你可能會(huì)以為瀏覽器應(yīng)該開(kāi)始繪制,將DOM更新顯示在屏幕上。但是在繪制之前,瀏覽器會(huì)檢查JavaScript事件隊(duì)列中是否還有其他任務(wù),有的任務(wù)會(huì)比繪制更優(yōu)先執(zhí)行。

          當(dāng)JavaScript線程忙于渲染第一個(gè)keypress時(shí),產(chǎn)生第二個(gè)用戶輸入(如鍵盤按下事件)就會(huì)出現(xiàn)這種情況(你可以看到第二個(gè)Key Character輸入發(fā)生在第一個(gè)keypress執(zhí)行棧依然在運(yùn)行時(shí))。這就是前面提到的UI阻塞。第二個(gè)Event (keypress)阻塞了UI更新第一個(gè)keypress。

          不幸的是,這會(huì)導(dǎo)致巨大的延遲。因?yàn)殇秩颈旧矸浅Bú糠衷蚴且驗(yàn)殇秩局邪税嘿F的搜索算法),如果用戶輸入非常快,那么很大可能會(huì)在前一個(gè)執(zhí)行棧結(jié)束之前輸入新的字符。這會(huì)產(chǎn)生新的Event (keypress),并且它的優(yōu)先級(jí)比瀏覽器繪制要高。所以繪制會(huì)不斷被用戶的輸入拖延。

          不僅如此,甚至在用戶停止輸入后,隊(duì)列中依然滯留了許多keypress時(shí)間,React需要依次對(duì)每個(gè)keypress進(jìn)行計(jì)算。所以,即使在輸入結(jié)束后,也不得不等待這些針對(duì)早已不需要的searchTeams的搜索!




          注意最后一個(gè)Key Character發(fā)生后,還有4個(gè)Event (keypress)滯留,瀏覽器需要處理完所有事件才能重繪。

          改進(jìn)方法

          為了解決這個(gè)問(wèn)題,重要的是要理解好的UI的要素是什么。實(shí)際上,對(duì)于每次鍵盤輸入,用戶期待的視覺(jué)反饋包括兩個(gè)獨(dú)立的要素:

          • 用戶輸入的鍵顯示在輸入框中;
          • 搜索結(jié)果根據(jù)新的searchTeam進(jìn)行更新。


          理解用戶的期望才能找到解決方案。盡管Google搜索快得像閃電一樣,但用戶無(wú)法立即收到搜索結(jié)果的事情也屢見(jiàn)不鮮。一些UI甚至?xí)谡?qǐng)求搜索結(jié)果時(shí)顯示加載進(jìn)度條。

          重要的是要理解,對(duì)于反應(yīng)迅速的UI而言,第一種反饋(按下的鍵顯示在輸入框中)扮演了非常重要的角色。如果UI無(wú)法做到這一點(diǎn),就會(huì)有嚴(yán)重的問(wèn)題。

          查看性能評(píng)測(cè)是解決問(wèn)題的第一個(gè)提示。仔細(xì)觀察這些長(zhǎng)長(zhǎng)的執(zhí)行棧和render中包含的昂貴的search方法,我們會(huì)發(fā)現(xiàn),更新輸入框和搜索結(jié)果的一切操作都發(fā)生在同一個(gè)執(zhí)行棧內(nèi)。所以,兩者的UI更新都會(huì)被搜索算法阻塞。

          但是,輸入框的更新不需要等待結(jié)果!它只需要知道用戶按下了哪個(gè)鍵,而不需要知道搜索結(jié)果是什么。如果我們有辦法控制事件執(zhí)行的順序,輸入框就有機(jī)會(huì)先更新UI,再去渲染搜索結(jié)果,這樣就能減少一些延遲。因此,我們的第一個(gè)優(yōu)化措施就是將輸入框的渲染從搜索結(jié)果的渲染中分離出來(lái)。

          注意:熟悉Dan Abramov在React JSConf 2018上的演講的人應(yīng)該能回憶起這個(gè)場(chǎng)景。在他的幻燈片中,他設(shè)計(jì)了一個(gè)昂貴的更新操作,隨著輸入值的增加,屏幕上需要渲染的組件也越來(lái)越多。這里我們遇到的困難非常相似,只不過(guò)是隨著搜索關(guān)鍵字長(zhǎng)度的增加,單個(gè)搜索函數(shù)的復(fù)雜度會(huì)增加而已。在Dan的演講中,他演示了時(shí)間切片(Time Slicing),這個(gè)React團(tuán)隊(duì)在開(kāi)發(fā)中的功能也許可以解決這個(gè)問(wèn)題!我們的嘗試會(huì)以相似的方案解決問(wèn)題:找到一個(gè)方法來(lái)改變渲染的順序,防止昂貴的計(jì)算再次阻塞主線程的UI更新。



          第三篇 異步渲染(componentDidUpdate)


          注意:本篇討論的優(yōu)化最后以失敗告終了,但我認(rèn)為值得講一講,因?yàn)樗軒椭覀兏玫乩斫釸eact的componentDidUpdate生命周期。如果你非常熟悉React,或者只想看看怎樣改善性能問(wèn)題,那么可以直接跳到下一篇。

          拆分組件

          由于我們想把昂貴的搜索結(jié)果更新從輸入框更新中拆分出來(lái),所以我們應(yīng)該自己設(shè)計(jì)一個(gè)組件,并放棄使用react-autocomplete庫(kù)提供的一站式解決方案Autocomplete:

          //autocomplete.js
          render () {
           return (
           <div>
           <input
           onChange={ e => this.setState({searchTerm: e.target.value})}
           value={this.state.searchTerm}/>
           <SearchResults
           searchEngine={this.props.searchEngine}
           searchTerm={this.state.searchTerm}/>
           </div> 
           )
          }
          


          然后在SearchResults中,我們需要異步觸發(fā)searchEngine.search(searchTerm),而不應(yīng)該在更新searchTerm的同一個(gè)渲染中進(jìn)行。

          我最初的想法是利用SearchResults的componentDidUpdate,讓searchEngine異步工作,因?yàn)槁?tīng)上去這個(gè)方法似乎是在更新之后異步執(zhí)行的。

          //searchResults.js
          componentDidUpdate(prevProps) {
           const {searchTerm, searchEngine} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           this.setState({
           searchResults: searchEngine.search(searchTerm)
           })
           }
          }
          render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
          }
          


          我們將昂貴的searchEngine移動(dòng)到了componentDidUpdate中,這樣就不用在render方法中調(diào)用,而是等到更新之后再執(zhí)行。我希望在輸入框更新之后的另一個(gè)執(zhí)行棧中執(zhí)行render,并兩者之間執(zhí)行一次繪制。我想象的新的更新生命周期如下:

          • 輸入框使用新的searchTerm渲染;
          • React把帶有新的searchTerm的componentDidUpdate searchEngine任務(wù)放入隊(duì)列;
          • 瀏覽器繪制輸入框的更新,然后處理隊(duì)列中的searchEngine任務(wù)。理論上,瀏覽器不會(huì)把這個(gè)任務(wù)放在繪制任務(wù)之前,因?yàn)樗簧婕坝脩艚换ナ录?/li>
          • componentDidUpdate在輸入框繪制之后執(zhí)行,計(jì)算搜索結(jié)果并生成新的更新。


          很不幸,認(rèn)為componentDidUpdate會(huì)在瀏覽器更新之后運(yùn)行是一個(gè)常見(jiàn)的誤解。我們來(lái)看看這個(gè)方法的性能評(píng)測(cè):




          看到問(wèn)題了嗎?componentDidUpdate跟最初的keypress事件是在同一個(gè)執(zhí)行棧上執(zhí)行的

          componentDidUpdate并不會(huì)在繪制結(jié)束后執(zhí)行,因此執(zhí)行棧跟上一篇一樣昂貴,我們只不過(guò)是將昂貴的search方法移動(dòng)到了不同位置而已。盡管這個(gè)解決方案并不能改善性能,但我們可以借此機(jī)會(huì)理解React的生命周期componentDidUpdate的具體行為。

          雖然componentDidUpdate不會(huì)在另一個(gè)執(zhí)行棧上運(yùn)行,但它確實(shí)是在React更新完組件狀態(tài)并將更新后的DOM值提交之后才執(zhí)行的。盡管這些更新后的DOM值還沒(méi)有被瀏覽器繪制,它們依然反映了更新后的UI應(yīng)有的樣子。所以,任何componentDidupdate內(nèi)執(zhí)行的DOM查詢都能訪問(wèn)到更新后的值。所以,組件確實(shí)更新了,只是瀏覽器中看不見(jiàn)而已。

          所以,如果想要做DOM計(jì)算,一般都應(yīng)該在componentDidUpdate中進(jìn)行。在這里很方便根據(jù)布局改變進(jìn)行更新,比如根據(jù)新的布局方式計(jì)算元素的位置或大小,然后更新?tīng)顟B(tài)等。

          如果componentDidUpdate每次觸發(fā)改變布局的更新時(shí)都要等待實(shí)際的瀏覽器繪制,那么用戶體驗(yàn)會(huì)非常糟糕,因?yàn)橛脩艨赡軙?huì)在布局改變時(shí)看到兩次屏幕閃爍。

          注(React Hooks):這個(gè)差異也有助于理解新的useEffect和useLayoutEffect鉤子。useEffect就是我們?cè)谶@里嘗試實(shí)現(xiàn)的效果。它會(huì)讓代碼在另一個(gè)執(zhí)行棧中運(yùn)行,從而在執(zhí)行之前瀏覽器可以進(jìn)行繪制。而useLayoutEffect更像是componentDidUpdate,允許你在DOM更新之后、瀏覽器繪制之前執(zhí)行代碼。



          第四篇 異步渲染(setTimeout)


          上一篇我們拆分了組件:

          //autocomplete.js
          render () {
           return (
           <div>
           <input
           onChange={ e => this.setState({searchTerm: e.target.value})}
           value={this.state.searchTerm}/>
           <SearchResults
           searchEngine={this.props.searchEngine}
           searchTerm={this.state.searchTerm}/>
           </div> 
           )
          }
          


          但我們沒(méi)能讓昂貴的searchEngine在另一個(gè)執(zhí)行棧上運(yùn)行。那么,還有什么辦法能實(shí)現(xiàn)這一點(diǎn)呢?

          有兩個(gè)常見(jiàn)的方法可以設(shè)置異步調(diào)用:Promise和setTimeout。

          Promise

          //searchResults.js
          componentDidUpdate(prevProps) {
           const {searchTerm, searchEngine} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           /* stick the update with the expensive search method into
           a promise callback: */
           Promise.resolve().then(() => {
           this.setState({
           searchResults: searchEngine.search(searchTerm)
           })
           })
           }
          }
          render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
          }
          


          我們來(lái)看看性能評(píng)測(cè):



          (anonymous)是Promise.then()回調(diào)函數(shù)


          又失敗了!

          理論上Promsie的回調(diào)函數(shù)是異步的,因?yàn)樗鼈儾粫?huì)同步執(zhí)行,但實(shí)際上還是在同一個(gè)執(zhí)行棧中運(yùn)行的。

          仔細(xì)看看性能評(píng)測(cè)就會(huì)發(fā)現(xiàn),回調(diào)函數(shù)被放在了Run Microtasks下,因?yàn)镻romise的回調(diào)函數(shù)被當(dāng)作了微任務(wù)。瀏覽器通常會(huì)在完成正常的棧之后檢查并運(yùn)行微任務(wù)。

          更多信息:Jake Archibald有一篇非常好的演講(https://medium.com/r/?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DcCOL7MC4Pl0),解釋了JavaScript事件循環(huán)在微任務(wù)方面的處理,還深入討論了許多我涉及到的話題。

          盡管了解這一點(diǎn)很好,但并沒(méi)有解決問(wèn)題。我們需要新的執(zhí)行棧,這樣瀏覽器才有機(jī)會(huì)在新的執(zhí)行棧開(kāi)始之前進(jìn)行繪制。

          setTimeout

          //searchResults.js
          componentDidUpdate(prevProps) {
           const {searchTerm, searchEngine} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           /* stick the update with the expensive search method into
           a setTimeout callback: */
           const setTimeoutCallback = () => {
           this.setState({
           searchResults: searchEngine.search(searchTerm)
           })
           }
           setTimeout(setTimeoutCallback)
           }
          }
          render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
          }
          


          性能評(píng)測(cè):



          繪制很難看到,它太小了,但藍(lán)線的位置的確發(fā)生了繪制


          哈哈!成功了!注意到這里有兩個(gè)執(zhí)行棧:Event (keypress)和Timer Fired (searchResults.js:49)。兩個(gè)棧之間發(fā)生了一次繪制(藍(lán)線的位置)。這正是我們想要的!來(lái)看看漂亮的UI!



          按住刪除鍵時(shí)依然有明顯的延遲


          有很大的改進(jìn),但依然很令人失望……這個(gè)頁(yè)面的確變好了,但依然能感覺(jué)到UI的延遲。我們來(lái)仔細(xì)看看性能測(cè)試。




          我們需要一些技巧才能分析這個(gè)性能測(cè)試報(bào)告并找出延遲的原因。使用性能報(bào)告有幾個(gè)小技巧:

          性能評(píng)測(cè)工具著重顯示了兩個(gè)特別有用的Key Input Interactions,每個(gè)都有不同的性能度量:

          • Key Down:從鍵盤按下到Event (keypress)處理函數(shù)被調(diào)用的時(shí)間間隔;
          • Key Character:從鍵盤按下到瀏覽器繪制更新的時(shí)間間隔。


          理想狀態(tài)下,Key Down交互應(yīng)該非常短,因?yàn)槿绻鸍avaScript主線程沒(méi)有被阻塞的話,事件應(yīng)該在鍵盤按下之后立即出發(fā)。所以,看到長(zhǎng)長(zhǎng)的Key Down就意味著發(fā)生了UI阻塞問(wèn)題。

          在本例中,長(zhǎng)長(zhǎng)的Key Down的原因是它們觸發(fā)時(shí),主線程還在被昂貴的setTimeoutCallback阻塞,比如最后的Key Down。很不幸,Key Down發(fā)生時(shí),運(yùn)行昂貴的search的setTimeoutCallback剛剛開(kāi)始,也就是說(shuō),Key Down只有等待search的計(jì)算結(jié)束才能觸發(fā)事件。這個(gè)評(píng)測(cè)中的search方法大約花了330毫秒,也就是1/3秒。從優(yōu)秀的UI角度而言,1/3秒的主線程阻塞實(shí)在太長(zhǎng)了。

          特別引起我注意的是最后一個(gè)Key Character。盡管它關(guān)聯(lián)了Key Down的結(jié)束并且觸發(fā)了Event (keypress),瀏覽器并沒(méi)有繪制新的searchTerm,而是執(zhí)行了另一個(gè)setTimeoutCallback。這就是Key Character交互花了兩倍時(shí)間的原因。

          這一點(diǎn)著實(shí)讓我大跌眼鏡。將search移動(dòng)到setTimeoutCallback的目的,就是讓瀏覽器能夠在調(diào)用setTimeoutCallback之前進(jìn)行繪制。但是在最后的Event (keypress)之前依然沒(méi)有繪制(藍(lán)線的位置)。

          結(jié)論是,我們不能依賴于瀏覽器的隊(duì)列機(jī)制。顯然瀏覽器并不一定將繪制排在超時(shí)回調(diào)之前。如果超時(shí)回調(diào)需要占用主線程330毫秒,那么也會(huì)阻礙主線程,導(dǎo)致延遲。



          第五篇 多線程


          在上一篇中,我們拆分了組件,并成功地使用setTimeout將昂貴的search移動(dòng)到了另一個(gè)執(zhí)行棧中,因此瀏覽器無(wú)需等待 search完成,就可以繪制輸入框的更新:

          //autocomplete.js
          render () {
           return (
           <div>
           <input
           onChange={ e => this.setState({searchTerm: e.target.value})}
           value={this.state.searchTerm}/>
           <SearchResults
           searchEngine={this.props.searchEngine}
           searchTerm={this.state.searchTerm}/>
           </div> 
           )
          }
          //searchResults.js
          componentDidUpdate(prevProps) {
           const {searchTerm, searchEngine} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           const setTimeoutCallback = () => {
           this.setState({
           searchResults: searchEngine.search(searchTerm)
           })
           }
           setTimeout(setTimeoutCallback)
           }
          }
          render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
          }
          


          不幸的是,這依然沒(méi)有解決每個(gè)searchTerm導(dǎo)致search阻塞主線程330毫秒并導(dǎo)致UI延遲的問(wèn)題。

          JavaScript的單線程實(shí)在太糟糕了……突然我想到了一個(gè)方法。

          最近我在閱讀漸進(jìn)式Web應(yīng)用,其中有人使用Service Worker來(lái)實(shí)現(xiàn)一些過(guò)程,比如在另一個(gè)線程中進(jìn)行緩存。于是我開(kāi)始學(xué)習(xí)Service Worker。這是一個(gè)全新的API,我需要花點(diǎn)時(shí)間來(lái)學(xué)習(xí)。

          但在學(xué)習(xí)之前我想先通過(guò)實(shí)驗(yàn)來(lái)驗(yàn)證一下增加額外的線程是否真的能夠提高性能。

          用服務(wù)器端來(lái)模擬第二個(gè)線程

          我以前就做過(guò)搜索和自動(dòng)補(bǔ)齊提示的功能,但這次特別困難的原因是需要完全在前端實(shí)現(xiàn)。以前我做過(guò)用API來(lái)獲取搜索結(jié)果。其中一種思路是,API和運(yùn)行API的服務(wù)器實(shí)際上相當(dāng)于前端應(yīng)用利用的另一個(gè)線程。

          于是,我想到可以做一個(gè)簡(jiǎn)單的node服務(wù)器讓searchTerm訪問(wèn),從而實(shí)現(xiàn)在另一個(gè)線程中運(yùn)行昂貴的搜索。這個(gè)功能非常容易實(shí)現(xiàn),因?yàn)檫@個(gè)項(xiàng)目中已經(jīng)設(shè)置過(guò)開(kāi)發(fā)用的服務(wù)器了。所以我只需添加一個(gè)新的路徑:

          app.route('/prep-staging/testSearch')
           .post(bodyParser.json(), (req, res) => {
           const {data, searchTerm} = req.body
           const engine = new SearchEngine(data)
           const searchResults = engine.search(searchTerm)
           res.send({searchResult})
           })
          


          然后將SearchResults中的setTimeout改成fetch:

          //searchResults.js
          componentDidUpdate(prevProps) {
           const {searchTerm, searchEngine, data} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           /* ping the search route with the searchTerm and update state
           with the results when they return: */
           fetch(`testSearch`, {
           method: 'POST',
           body: JSON.stringify({data, searchTerm}),
           headers: {
           'content-type': 'application/json'
           }
           })
           .then(r => r.json())
           .then(resp => this.setState({searchResults: resp.searchResults}))
           }
          }
          render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
          }
          


          現(xiàn)在是見(jiàn)證奇跡的時(shí)刻!




          注意看刪除!

          太棒了!輸入框的更新幾乎非常完美。而另一方面,搜索結(jié)果的更新依然非常緩慢,但沒(méi)關(guān)系!別忘了我們的首要任務(wù)就是讓用戶在輸入時(shí)盡快獲得反饋。我們來(lái)看看性能測(cè)試報(bào)告:




          注意主線程中間漂亮的空白,它不再是之前層層疊疊的樣子了。性能優(yōu)化中經(jīng)常會(huì)遇到這種情況。主線程中的空白越多越好!

          從頂端可以看到testSearch花費(fèi)的時(shí)間。最長(zhǎng)的一個(gè)實(shí)際上花了800毫秒,讓我很吃驚,但仔細(xì)想想就會(huì)發(fā)現(xiàn),并不是search花了這么長(zhǎng)時(shí)間,而是我們的Node服務(wù)器也是單線程的。它在第一個(gè)搜索完成之前無(wú)法開(kāi)始另一個(gè)搜索。由于輸入比搜索快得多,所以搜索會(huì)進(jìn)入隊(duì)列然后被延遲。搜索函數(shù)實(shí)際花費(fèi)的時(shí)間是前一個(gè)搜索完成之后的部分,大約315毫秒。

          總的來(lái)說(shuō),將昂貴的任務(wù)放到服務(wù)器線程中,就可以將堆疊的棧移動(dòng)到服務(wù)器上。所以,盡管依然有改進(jìn)的空間,但主線程看起來(lái)非常好,UI的響應(yīng)速度也更快了!

          我們已經(jīng)證明這個(gè)思路是正確的,現(xiàn)在來(lái)實(shí)現(xiàn)吧!

          做了一點(diǎn)研究后我發(fā)現(xiàn),Server Worker并不是正確的選擇,因?yàn)樗患嫒軮nternet Explorer。幸運(yùn)的是,它還有個(gè)近親,叫做Web Worker,能兼容所有主流服務(wù)器,API更簡(jiǎn)單,而且能完成我們需要的功能!



          第六篇 Web Worker


          Web worker能夠在JavaScript的主線程之外的另一個(gè)線程上運(yùn)行代碼,每個(gè)Web worker都由一個(gè)腳本文件啟動(dòng)。啟動(dòng)方式非常簡(jiǎn)單:

          //searchResults.js
          export default class SearchResults extends React.Component {
           constructor (props) {
           super();
           this.state = {
           searchResults: [],
           }
           //initiate the webworker:
           this.webWorker = new Worker('...path to webWorker.js') 
           //pass it the 13,000 item search data to initialize the searchEngine with:
           this.webWorker.postMessage({data: props.data})
           //assign the handler that will accept the searchResults when it sends them back:
           this.webWorker.onmessage = this.handleResults
           }
           componentDidUpdate(prevProps) {
           const {searchTerm} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           //change our async search request to a .postMessage, the messaging API of webWorkers:
           this.webWorker.postMessage({searchTerm})
           }
           }
           handleResults = (e) => {
           const {searchResults} = e.data
           this.setState({
           searchResults
           })
           }
           render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
           }
          }
          


          下面是webWorker.js腳本,在SearchResults的構(gòu)造函數(shù)中進(jìn)行初始化:

          //webWorker.js
          self.importScripts('...the search engine script, provides the SearchEngine constructor');
          let searchEngine; 
          let cache = {} 
          //thought I would add a simple cache... Wait till you see those deletes now :)
          function initiateSearchEngine (data) {
           //initiate the search engine with the 13,000 item data set
           searchEngine = new SearchEngine(data); 
           //reset the cache on initiate just in case
           cache = {}; 
          }
          function search (searchTerm) {
           const cachedResult = cache[searchTerm]
           if(cachedResult) {
           self.postMessage(cachedResult)
           return
           }
           const message = {
           searchResults: searchEngine.search(searchTerm)
           };
           cache[searchTerm] = message;
           //self.postMessage is the api for sending messages to main thread
           self.postMessage(message)
          }
          /*self.onmessage is where we define the handler for messages recieved
          from the main thread*/
          self.onmessage = function(e) {
           const {data, searchTerm} = e.data;
           /*We can determine how to respond to the .postMessage from 
           SearchResults.js based on which data properties it has:*/
           if(data) {
           initiateSearchEngine(data)
           } else if(searchTerm) {
           search(searchTerm)
           }
          }
          


          可以看到,我還加了些額外的代碼。這里我加了緩存,這樣之前搜索過(guò)的searchTerms就可以立即返回結(jié)果了。如此一來(lái),最耗性能的用戶交互(常按刪除鍵)的效率就提高了。

          我們來(lái)看看運(yùn)行情況:




          太棒了……非常快!這看起來(lái)很不錯(cuò)啊,實(shí)話說(shuō),做到這個(gè)樣子就可以直接發(fā)布了!

          但是,現(xiàn)在就發(fā)布多沒(méi)勁啊……

          從用戶體驗(yàn)的角度來(lái)說(shuō),這個(gè)UI已經(jīng)非常好了。如果仔細(xì)觀察,其實(shí)依然能看到搜索結(jié)果的延遲,但幾乎察覺(jué)不到……不過(guò)幸運(yùn)的是,從性能測(cè)試報(bào)告中可以看到低效率的地方:




          請(qǐng)無(wú)視灰色的條,我也不知道它們是怎么來(lái)的。

          報(bào)告中最左側(cè)的線程是我們關(guān)注的線程。Main線程已經(jīng)折疊了,因?yàn)槔锩嬷挥写罅康目瞻祝馕吨骶€程的性能非常好,不會(huì)成為任何主要的性能瓶頸。

          可以看到,Worker線程里堆滿了search調(diào)用。從最后一個(gè)Key Character輸入(藍(lán)線位置)之后就會(huì)看到其后果。Worker線程中的最后一個(gè)search實(shí)際上推遲了3個(gè)search才返回。測(cè)量一下會(huì)發(fā)現(xiàn),延遲大約有850毫秒。而且大部分都是不必要的,因?yàn)槟侨齻€(gè)search都沒(méi)用,我們不再需要它們返回的結(jié)果了。

          你也許在想:“這已經(jīng)很好了!再優(yōu)化下去性價(jià)比不高啊!”

          我不這樣認(rèn)為。首先,不要低估嘗試新事物和探索帶來(lái)的價(jià)值。如果你從來(lái)沒(méi)做過(guò)探索,就很可能無(wú)法評(píng)價(jià)是否值得,因?yàn)槟悴恢滥隳苡心男┦斋@,以及你將投入多少時(shí)間和努力。所以,我認(rèn)為這種探索帶來(lái)的經(jīng)驗(yàn)和知識(shí)是無(wú)價(jià)的。隨著知識(shí)的積累,你能更好地評(píng)價(jià)投入的時(shí)間是否值得,以及是否應(yīng)該考慮這些問(wèn)題。你可以做出更好的決定!

          其次,別忘了這并不是過(guò)早優(yōu)化。這些優(yōu)化都是根據(jù)性能評(píng)價(jià)做出的,我們可以測(cè)量出效果。不管怎樣評(píng)價(jià),如果能改善850毫秒的延遲,那都是非常重大的改進(jìn)。

          最后(但不是唯一),別忘了移動(dòng)端!雖然我不會(huì)在本文中介紹,但我在研究這個(gè)問(wèn)題時(shí),我也跟蹤了移動(dòng)端的性能,現(xiàn)在的條件下依然有能察覺(jué)得到的性能延遲。

          不管怎么說(shuō),我們來(lái)解決這個(gè)問(wèn)題!



          第七篇 確保searchTerm


          前面的性能評(píng)測(cè)揭示的最明顯的問(wèn)題就是,即使對(duì)于無(wú)用的searchTerm也會(huì)運(yùn)行昂貴的搜索。所以目前的解決方案之一就是在執(zhí)行昂貴的搜索之前確保searchTerm是最新的。只要在webWorker腳本中加入confirmSearchTerm就可以非常容易地實(shí)現(xiàn):

          //webWorker.js
          self.importScripts('...the search engine script, provides the SearchEngine constructor');
          let searchEngine; 
          let cache = {}
          function initiateSearchEngine (data) {
           searchEngine = new SearchEngine(data);
           cache = {};
          }
          function search (searchTerm) {
           const cachedResult = cache[searchTerm]
           if(cachedResult) {
           self.postMessage(cachedResult)
           return
           }
           const message = {
           searchResults: searchEngine.search(searchTerm)
           };
           cache[searchTerm] = message;
           self.postMessage(message)
          }
          function confirmSearchTerm (searchTerm) {
           self.postMessage({confirmSearchTerm: searchTerm})
          }
          self.onmessage = function(e) {
           const {data, searchTerm, confirmed} = e.data;
           if(data) {
           initiateSearchEngine(data)
           } else if(searchTerm) {
           /*check if the searchTerm is confirmed, if not, send a confirmSearchTerm message 
           to compare the searchTerm with the latest value on the main thread */
           confirmed ? search(searchTerm) : confirmSearchTerm(searchTerm)
           }
          }
          


          這里還給SearchResults handleResults加了個(gè)額外的條件,監(jiān)聽(tīng)confirmSearchTerm的請(qǐng)求:

          //searchResults.js
          export default class SearchResults extends React.Component {
           constructor (props) {
           super();
           this.state = {
           searchResults: [],
           }
           this.webWorker = new Worker('...path to webWorker.js') 
           this.webWorker.postMessage({data: props.data})
           this.webWorker.onmessage = this.handleResults
           }
           componentDidUpdate(prevProps) {
           const {searchTerm} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           this.webWorker.postMessage({searchTerm})
           }
           }
           handleResults = (e) => {
           const {searchResults, confirmSearchTerm} = e.data;
           /* check if confirmSearchTerm property was sent, if so compare it to the 
           latest searchTerm and send back a confirmed searchTerm message */
           if (confirmSearchTerm && confirmSearchTerm === this.props.searchTerm) {
           this.webWorker.postMessage({
           searchTerm: this.props.searchTerm,
           confirmed: true
           })
           } else if (searchResults) {
           this.setState({
           searchResults
           })
           }
           }
           render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
           }
          }
          


          我們來(lái)看看性能評(píng)測(cè),看看有沒(méi)有改進(jìn):




          很難看出結(jié)果,因?yàn)樗鼈冞\(yùn)行得太快了,但在每次Worker的執(zhí)行棧之前都會(huì)執(zhí)行confirmSearchTerm(見(jiàn)藍(lán)線)。

          說(shuō)明的確管用了:Worker在每次運(yùn)行昂貴的search方法之前都會(huì)確認(rèn)搜索是否必要。而且可以看到,頂部的橙色部分有4個(gè)Key Character輸入,但只運(yùn)行了三個(gè)搜索。這里我們成功地去掉了一個(gè)不必要的搜索,節(jié)約了最多330毫秒。但之前我們看到,多個(gè)額外的搜索會(huì)進(jìn)入隊(duì)列然后再不必要地運(yùn)行,而現(xiàn)在我們完全避免了這個(gè)問(wèn)題。所以,節(jié)約的時(shí)間非常顯著,特別是在移動(dòng)端上。

          但仔細(xì)觀察就會(huì)發(fā)現(xiàn)我們依然在浪費(fèi)時(shí)間:




          最后一個(gè)搜索使用了最新的searchTerm,但依然要至少等待當(dāng)前的搜索完成后才能開(kāi)始。浪費(fèi)了84毫秒(藍(lán)色高亮部分)!據(jù)我所知,執(zhí)行棧一旦開(kāi)始就無(wú)法取消。那么我們是不是無(wú)計(jì)可施了呢?



          第八篇 Web Worker陣列


          如果多加一個(gè)線程的效果很好,那么加4個(gè)會(huì)怎樣?

          實(shí)話實(shí)說(shuō),現(xiàn)在這些只是出于興趣……但說(shuō)真的,最后這次優(yōu)化確實(shí)在移動(dòng)端上帶來(lái)了人眼能察覺(jué)到的改善……

          無(wú)論怎樣,現(xiàn)在我打算用Web Worker陣列!




          為了出這份報(bào)告,我用人類最快的速度輸入的!

          圖中可以看到,頂端每個(gè)橙色的Key Character都有一個(gè)ww worker線程,能立即開(kāi)始搜索(橙色條)。不再需要等待前一個(gè)搜索結(jié)束。而且每個(gè)ww在結(jié)束后就能用于下一次搜索。

          這是因?yàn)槲覀冊(cè)O(shè)置了workerArray.js這個(gè)web worker作為分發(fā)器。圖中看不到,因?yàn)樗鼒?zhí)行得太快了,但對(duì)于每個(gè)Key Character,workerArray都會(huì)執(zhí)行一個(gè)微笑的執(zhí)行棧,用來(lái)處理主線程傳來(lái)的搜索請(qǐng)求消息,然后分發(fā)給第一個(gè)可用的ww worker。

          我們成功地解決了“搜索堆”的問(wèn)題。可以認(rèn)為用增加車道的方式解決了交通擁堵。

          為什么用4個(gè)搜索worker呢?因?yàn)槲以跍y(cè)試時(shí)的輸入速度從來(lái)沒(méi)能到過(guò)需要第五個(gè)worker的速度(增加worker帶來(lái)的改進(jìn)非常微小)。

          結(jié)果發(fā)現(xiàn),從Key Character輸入到search執(zhí)行之間沒(méi)有任何延遲。除非找到另一個(gè)更有效的搜索算法,否則我們已經(jīng)成功地移除了所有性能瓶頸。

          別忘了,我并沒(méi)有說(shuō)這是最佳的解決方案。是否每臺(tái)手機(jī)都能處理4個(gè)web worker?性能改善是否值得付出這些額外的代碼復(fù)雜度?是否還有其他安全方面的考量,導(dǎo)致代碼更加復(fù)雜?

          這些問(wèn)題都非常重要,正是這些問(wèn)題會(huì)最終引出這樣的解決方案。

          但至少現(xiàn)在,這個(gè)Web worker陣列非常優(yōu)秀!我們來(lái)看看實(shí)際效果:




          感謝你耐心地閱讀完所有的篇節(jié)!

          如果說(shuō)這一系列優(yōu)化有什么感想的話,那就是:

          • 不要害怕嘗試新事物,不要害怕不尋常的方案。
          • 方案是否好用并不重要,它們帶來(lái)的經(jīng)驗(yàn)和知識(shí)才是最有價(jià)值的!


          如果你有興趣,可以看看下面Web worker陣列的代碼。



          課外作業(yè)


          下面的代碼中有個(gè)小問(wèn)題。需要一個(gè)非常微小的修改才能使它更強(qiáng)壯,最多兩行代碼。你能找到問(wèn)題所在并修復(fù)嗎?

          //searchResults.js
          export default class SearchResults extends React.Component {
           constructor (props) {
           super();
           this.state = {
           searchResults: [],
           }
           //initiate the worker array:
           this.workerArray = new WorkerArrayController({
           data: props.data,
           handleResults: this.handleResults,
           arraySize: 4
           });
           }
           componentDidUpdate(prevProps) {
           const {searchTerm} = this.props;
           if(searchTerm && searchTerm !== prevProps.searchTerm) {
           this.workerArray.search({searchTerm})
           }
           }
           handleResults = (e) => {
           const {searchResults} = e.data
           this.setState({
           searchResults
           })
           }
           componentWillUnmount () {
           this.workerArray.terminate();
           }
           render () {
           return <ReactVirtualizedList searchResults={this.state.searchResults}/>
           }
          }
          


          SearchResults組件初始化WorkerArrayController。

          //workerArrayController.js
          export default class WorkerArrayController {
           constructor ({data, handleResults, arraySize}) {
           this.workerArray = new Worker('... path to workerArray.js');
           let i = 1;
           this.webWorkers = {};
           while (i <= arraySize) {
           const workerName = `ww${i}`;
           this.webWorkers[workerName] = new Worker(`...path to ww1.js`);
           /* Creates a MessageChannel for each worker and passes that channel's 
           ports to both workerArray dispatcher and the worker so 
           they can communicate with each other */
           const channel = new MessageChannel();
           this.workerArray.postMessage({workerName}, [channel.port1]);
           this.webWorkers[workerName].postMessage({data}, [channel.port2]);
           i++;
           }
           this.workerArray.onmessage = handleResults;
           }
           search = (searchTerm) => {
           this.workerArray.postMessage({searchTerm});
           }
           terminate() {
           this.workerArray.terminate();
           for (const workerName in this.webWorkers) {
           this.webWorkers[workerName].terminate();
           }
           }
          }
          


          WorkerArrayController用4個(gè)ww初始化workerArray web worker,并傳遞MessageChannel端口給它們,這樣它們能夠互相通信。

          //workerArray.js
          const ports = {};
          let cache = {};
          let queue;
          function initiatePort (workerName, port) {
           ports[workerName] = port;
           const webWorker = ports[workerName];
           webWorker.inUse = false;
           webWorker.onmessage = function handleResults (e) {
           const {searchTerm, searchResults} = e.data;
           const message = {searchTerm, searchResults};
           /* If all workers happen to be inUse, the message gets saved to the
           the queue and passed to the first worker that finishes */
           if(queue) {
           webWorker.postMessage(queue);
           webWorker.inUse = true;
           queue = null;
           } else {
           webWorker.inUse = false;
           }
           cache[searchTerm] = message;
           self.postMessage(message);
           }
          }
          function dispatchSearchRequest (searchTerm) {
           const cachedResult = cache[searchTerm];
           if(cachedResult) {
           self.postMessage(cachedResult);
           return
           }
           const message = {searchTerm};
           for (const workerName in ports) {
           const webWorker = ports[workerName];
           if(!webWorker.inUse) {
           webWorker.postMessage(message);
           webWorker.inUse = true;
           return
           }
           }
           queue = message;
          }
          self.onmessage = function (e) {
           const {workerName, searchTerm} = e.data;
           if(workerName) {
           initiatePort(workerName, e.ports[0]);
           } else if(searchTerm) {
           dispatchSearchRequest(searchTerm);
           }
          }
          


          workerArray初始化端口對(duì)象用于通信,并跟蹤每個(gè)ww worker。它還初始化了緩存和隊(duì)列,萬(wàn)一所有端口都被占用的情況下用來(lái)跟蹤最新的searchTerm請(qǐng)求。

          //ww1.js
          self.importScripts('...the search engine script, provides the SearchEngine constructor');
          let searchEngine;
          let port;
          function initiate (data, port) {
           searchEngine = new SearchEngine(data);
           port = port;
           port.onmessage = search;
          }
          /* search is attached to the port as the message handler so it
          runs when communicating with the workerArray only */
          function search (e) {
           const {searchTerm} = e.data;
           const message = {
           searchResults: searchEngine.search(searchTerm)
           };
           port.postMessage(message)
          }
          /* self.onmessage is the handler that responds to messages from
          the main thread, which only fires during initiation */
          self.onmessage = function(e) {
           const {data} = e.data;
           initiate(data, e.ports[0]);
          }
          


          原文:Secrets of JavaScript: A tale of React, performance optimization and multi-threading

          本文為 CSDN 翻譯,轉(zhuǎn)載請(qǐng)注明來(lái)源出處。


          主站蜘蛛池模板: 丰满人妻一区二区三区免费视频| 中文字幕无线码一区二区| 四虎在线观看一区二区| 无码国产伦一区二区三区视频| 一区二区国产精品| 日本免费精品一区二区三区| 成人h动漫精品一区二区无码| 日韩精品一区二区亚洲AV观看| 日本大香伊一区二区三区| 国产色精品vr一区区三区| 亚洲国产av一区二区三区| 亚洲一区二区精品视频| 国产韩国精品一区二区三区| 国产福利电影一区二区三区,亚洲国模精品一区| 日韩高清一区二区| 波多野结衣中文一区二区免费| 怡红院一区二区在线观看| 精品国产日韩亚洲一区在线| 国产一区二区在线|播放| 日本丰满少妇一区二区三区| 久久久久久一区国产精品| 日韩精品无码一区二区三区四区| 国产AV午夜精品一区二区三| 国产爆乳无码一区二区麻豆| 日韩人妻一区二区三区蜜桃视频 | 日韩在线视频不卡一区二区三区| 日本一区二区三区四区视频| 日亚毛片免费乱码不卡一区| 一区二区三区四区无限乱码 | 亚洲国产精品一区第二页| 一区二区三区观看免费中文视频在线播放 | 国精无码欧精品亚洲一区| 无码人妻一区二区三区在线视频 | 久久久人妻精品无码一区| 国产suv精品一区二区33| 无码人妻一区二区三区兔费| 中文字幕一区二区人妻| 冲田杏梨高清无一区二区| 日韩免费一区二区三区在线 | 亚洲一区二区三区偷拍女厕| 亚洲午夜精品一区二区|