하지만 이 문제만 남으면 프로그래머가 코드로 해결하려면 프로그래밍 관점에서 문제를 고려해야 합니다. phper
로서 제가 생각한 첫 번째 해결책은
계획 1: 숫자 끝에 문자열 "000"을 붙입니다
계획 2: 원래 숫자에 1000을 곱하기만 하면 됩니다phper
第一时间想到的方案分别是
方案1:在数字末尾粘连字符串 “000”
方案2:将原数字简单的乘以 1000
当我把这个问题丢给我的朋友的时候,他告诉我:
方案1肯定不行!你应该采用方案2,但是如果你足够鸡贼的话,你应该采用正整数 X 1024 - 正整数 X 24
!
因为计算机是二进制,当你告诉他要乘以1000的时候,他会进行正整数 X 512 + 正整数 X 256 + 正整数 X 128 + 正整数 X 128 + 正整数 X 64 + 正整数 X 32 + 正整数 X 8
,一直累加到凑齐 正整数的 1000 倍 为止。而运算2的10次方
要比那一串加号更快接近结果。
【推荐学习:PHP视频教程】
大佬的这段话很快打动了我。为了践行大佬的真知,证明大佬的阐述对我犹如醍醐灌顶般点醒梦中人,我迅速写出了一小段方法,将一个随机正整数扩大1000倍的算法用三种不同的方法分别跑 一千万次,查看各个方法运行的效率(使用框架:laravel)
// 图表内容 $headers = ['次数', '方案1:拼接法', '方案2:乘1000', '方案3:乘以 1024']; $data = [ [0=>'第一次'], [0=>'第二次'], [0=>'第三次'] ]; // 每个方法执行三次 for ($count = 0; $count < 3; $count ++) { // 生成变量名 : plan1start1 $start = Carbon::now()->getPreciseTimestamp(); for ($i = 0; $i < 10000000; $i ++) { $integer = rand(1, 999); $result = (int)($integer . '000'); } $end = Carbon::now()->getPreciseTimestamp(); $data[$count][] = ($end - $start)/1000000 . '秒'; } for ($count = 0; $count < 3; $count ++) { $start = Carbon::now()->getPreciseTimestamp(); for ($i = 0; $i < 10000000; $i ++) { $integer = rand(1, 999); $result = $integer * 1000; } $end = Carbon::now()->getPreciseTimestamp(); $data[$count][] = ($end - $start)/1000000 . '秒'; } for ($count = 0; $count < 3; $count ++) { $start = Carbon::now()->getPreciseTimestamp(); for ($i = 0; $i < 10000000; $i ++) { $integer = rand(1, 999); $result = $integer * 1024 - $integer * 24; } $end = Carbon::now()->getPreciseTimestamp(); $data[$count][] = ($end - $start)/1000000 . '秒'; } $this->table($headers, $data);
将这段代码运行多次后均得到一个较为稳定的结果:
看到这个结果,大大的疑问重新占领了我小小的脑瓜。乘以 1024 再减去 乘以 24
反而比直接乘以 1000
慢一些。当我拿着这个结果去寻找大佬解决疑惑时,得到了他这样的回答:
平时工作不够多是不是?还有空做这种试验?
暗戳戳鄙夷他一把,顺便把他在我心中的地位从大佬
降格为我的某个不愿透露姓名的普通朋友
。我继续了对这件事请的思考。
在正整数后面拼接字符串 ‘000’,要把这个正整数转换为字符串,然后拼接字符串 ‘000’,之后再转回正整数。计算的复杂程度远超正整数的直接计算,时间上明显劣于后者,这点经过验证也毋庸置疑。
但是我的某个不愿透露姓名的豆豆同学对二进制
计算模式解释的同样头头是道。我学习的是解释型语言 php
,这意味着有一群对代码理解达到骨灰级的玩家在我看不到的地方对php
进行了大量的算法优化。而豆豆同学学习的是编译型语言 C++
양의 정수 X 1024 - 양의 정수 시간을 사용해야 합니다. 그는 <code>양의 정수 X 512 + 양의 정수 X 256 + 양의 정수 X 128 +를 수행합니다. 양의 정수 X 128 + 양의 정수 X 64 + 양의 정수 X 32 + 양의 정수 양의 정수의 1000배까지 구해집니다. <code>2의 10제곱
연산은 더하기 기호 문자열보다 더 빠르게 결과에 가까워집니다. 🎜🎜【추천 학습: PHP 동영상 튜토리얼]🎜🎜🎜 🎜연습은 진정한 지식을 가져옵니다🎜🎜대장님의 말씀은 나를 빠르게 감동시켰습니다. 형의 참된 지식을 실천하고 형의 설명이 나에게 깨달음과 같다는 것을 증명하기 위해 세 가지 다른 방법을 사용하여 임의의 양의 정수를 1000배로 확장하는 짧은 방법을 빠르게 작성했습니다. (프레임워크: laravel 사용) 🎜rrreee🎜이 코드를 여러 번 실행하면 비교적 안정적인 결과를 얻을 수 있습니다. 🎜🎜🎜🎜이 결과를 보고 크게 놀랐습니다. 의심이 다시 생겼습니다. 내 작은 마음. 1024를 곱한 다음 24를 빼는 것
은 1000을 직접 곱하는 것
보다 느립니다. 의심을 해결하기 위해 상사를 찾기 위해 이 결과를 얻었을 때 상사로부터 다음과 같은 답변을 받았습니다. 🎜🎜당신은 평소에 일을 충분히 하지 않습니까? 아직 그런 실험을 할 시간이 있나요? 🎜🎜🎜🎜 테스트 결과에 대한 생각🎜🎜 나는 그 사람을 몰래 멸시했고, 그런데 마음속으로 그 사람의 지위를 빅 브라더
에서 익명의 평범한 친구로 남을 내 사람으로 격하시켰어
. 나는 이 문제에 대해 계속해서 생각했다. 🎜🎜양의 정수 뒤에 문자열 '000'을 연결하려면 이 양의 정수를 문자열로 변환한 다음 문자열 '000'을 연결한 다음 다시 양의 정수로 변환하세요. 계산의 복잡성은 양의 정수를 직접 계산하는 것보다 훨씬 뛰어나며 시간 측면에서도 분명히 후자보다 열등하다는 것이 검증되었으며 의심의 여지가 없습니다. 🎜🎜그런데 익명의 Doudou 반 친구 중 한 명이 바이너리
계산 모드를 같은 방식으로 설명했습니다. 저는 해석 언어 PHP
를 배우고 있습니다. 즉, 코드에 대한 하드한 이해를 갖고 있고 php
에서 할 수 있는 많은 알고리즘을 수행한 플레이어 그룹이 있다는 뜻입니다. 최적화가 보이지 않습니다. 그리고 Doudou는 컴파일 언어 C++
를 배우고 있습니다. 이 작업의 다른 결과를 가져오는 것은 이 해석된 언어의 차이입니까? ㅋㅋㅋ위 내용은 PHP는 양의 정수를 가장 효율적으로 천 번 확장합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!