为什么并发速度比循环快?

异步并发与循环遍历的速度差异
博客探讨了代码执行相同任务时,异步并发比循环遍历速度快的现象。通过推导得出相关不等式,假设a为已存在线程数,n为并发执行量,并发量越大任务相对循环执行越快,但受CPU性能和IO限制有上限。

缘由

在使用代码执行相同任务时,通常会发现一个现象,就是使用异步并发时,会比循环遍历的速度快,明明是同样处理器单线程?

推导

1a−na+n<0\frac{1}{a}-\frac{n}{a+n}<0a1a+nn<0
=>a+n−ana(a+n)<0=>\frac{a+n-an}{a(a+n)}<0=>a(a+n)a+nan<0
a,na,na,n是自然数,有
=>a<(a−1)n=>a<(a-1)n=>a<(a1)n
=>n>aa−1>1=>n>\frac{a}{a-1}>1=>n>a1a>1

说明

当执行任务的时候,系统一直在运行,cpu处理任务时候,肯定是存在其他线程在使用cpu,所以假设aaa是已经存在的线程数,在执行系统的其他任务,nnn是并发执行的量,用于目标任务,并发量越大,任务相对循环执行要快。因为,
f(n)=na+nf(n)=\frac{n}{a+n}f(n)=a+nn
是增函数。由于cpu性能几乎固定和io的限制,因此有上限。简而言之,人多抢的资源就越多。

将 `b.file` 分成每三份上传完成一次再进行下次三份上传的实现方式,与普通循环一次性上传所有文件相比,不能简单地说哪种更,这取决于多种因素: ### 网络带宽服务器处理能力 - **高带宽并发处理能力**:如果网络带宽充足,服务器能够同时处理大量并发请求,那么一次性上传所有文件(普通循环)可能更。因为这种方式减少了等待每一批次上传完成的时间,多个请求可以并行处理。例如,在高速局域网环境下,服务器配置较高,能够同时处理大量文件上传任务,一次性上传可能会更高效。 ```javascript const { file, path_name, ...w } = b; const rr = Promise.all( b.file.map((qq) => { const p = { ...w, file: qq.file }; const e = new FormData(); Object.keys(p).forEach((t) => { e.append(t, p[t]); }); e.append('session_id', u() as string); const n = pl(d.value, path_name); e.append( 'path_name', `${n.path_name === '/' ? `/${n.element_name}` : `${n.path_name}/${n.element_name}`}` ); e.append('folder_id', n.aic_element_id); return wap(e, wapConfigFun(qq.uid)); }) ) .then(() => { r(true); i.success('上传成功'); asb(); }) .catch((e) => { console.log(e); r(false); }); ``` - **低带宽或服务器并发处理能力有限**:当网络带宽有限,或者服务器在高并发情况下处理能力下降时,将文件分成每三份一组上传可以避免过多的并发请求导致网络拥塞或服务器过载。这种方式可以让服务器有足够的时间处理每一批文件,从而提高整体上传效率。例如,在网络环境较差的移动网络中,或者服务器配置较低时,分批上传可能更合适。 ### 单个文件大小 - **大文件**:如果单个文件体积较大,一次性上传多个大文件可能会占用过多的网络带宽服务器资源,导致上传速度变慢。此时,分批上传可以将资源分配到不同的时间段,减少资源竞争,提高上传效率。 - **小文件**:对于小文件,一次性上传所有文件可能更,因为减少了请求的开销。 ### 代码实现复杂度 - 分批上传的代码相对复杂,需要额外的逻辑来管理批次递归调用。而普通循环一次性上传的代码更简单,易于理解维护。 综上所述,不能简单地说哪种方式更,需要根据具体的网络环境、服务器配置文件大小等因素来选择合适的上传方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值