Heim >Backend-Entwicklung >PHP-Tutorial >PHP erweitert eine positive ganze Zahl am effizientesten um das Tausendfache
Aber wenn dieses Problem gelöst ist Um Programmierer mit Code zu lösen, muss das Problem aus Programmierperspektive betrachtet werden. Als phper
fielen mir als erstes folgende Lösungen ein:
Plan 1: Kleben Sie die Zeichenfolge „000“ an das Ende der Zahl
Plan 2: Einfach die ursprüngliche Zahl mit 1000 multiplizierenphper
第一时间想到的方案分别是
方案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++
positive ganze Zahl X 1024 - positive ganze Zahl verwenden. Wenn er <code>positive ganze Zahl X 512 + positive ganze Zahl positive Ganzzahl X 128 + positive Ganzzahl X 64 + positive Ganzzahl Bis das 1000-fache der positiven Ganzzahl erfasst ist. Die Operation <code>2 hoch 10
kommt dem Ergebnis schneller näher als diese Folge von Pluszeichen. 🎜🎜【Empfohlenes Lernen: PHP-Video-Tutorial]🎜🎜🎜 🎜Übung bringt wahres Wissen🎜🎜Die Worte des großen Chefs haben mich schnell berührt. Um das wahre Wissen des großen Bruders zu üben und zu beweisen, dass die Erklärung des großen Bruders für mich wie eine Erleuchtung ist, habe ich schnell eine kurze Methode geschrieben und drei verschiedene Methoden verwendet, um eine zufällige positive Ganzzahl um das 1000-fache zu erweitern bzw. um die Effizienz jeder Methode zu überprüfen (unter Verwendung des Frameworks: laravel) 🎜rrreee🎜Nach mehrmaliger Ausführung dieses Codes wird ein relativ stabiles Ergebnis erhalten: 🎜🎜🎜🎜Als ich dieses Ergebnis sah, war ich sehr überrascht. Die Zweifel kamen wieder auf mein kleiner Verstand. Das Multiplizieren mit 1024 und das anschließende Subtrahieren mit 24
ist langsamer als das Direkte Multiplizieren mit 1000
. Als ich dieses Ergebnis nutzte, um den Chef zu finden, der meine Zweifel ausräumen konnte, bekam ich diese Antwort von ihm: 🎜🎜Du arbeitest normalerweise nicht genug, nicht wahr? Ist noch Zeit für ein solches Experiment? 🎜🎜🎜🎜 Gedanken zu den Testergebnissen🎜🎜 Ich habe ihn insgeheim verachtet und nebenbei seinen Status in meinem Herzen von Großer Bruder
auf jemand von mir herabgestuft, der anonym bleiben soll, ganz normale Freunde. Ich dachte weiter über diese Angelegenheit nach. 🎜🎜Um die Zeichenfolge „000“ nach einer positiven Ganzzahl zu verketten, konvertieren Sie diese positive Ganzzahl in eine Zeichenfolge, verketten Sie dann die Zeichenfolge „000“ und konvertieren Sie sie dann wieder in eine positive Ganzzahl. Die Komplexität der Berechnung übersteigt die direkte Berechnung positiver Ganzzahlen bei weitem und ist dieser in Bezug auf die Zeit offensichtlich unterlegen. Dies wurde überprüft und es besteht kein Zweifel. 🎜🎜Aber einer meiner anonymen Doudou-Klassenkameraden erklärte den Berechnungsmodus <code>binär
auf die gleiche Weise. Ich lerne die interpretierte Sprache PHP
, was bedeutet, dass eine Gruppe von Spielern mit einem Hardcore-Verständnis von Code viele Algorithmen auf php
ausgeführt hat, wo ich sie nicht sehen kann. Optimierung. Und Doudou lernt die kompilierte Sprache C++
. Ist es der Unterschied in dieser interpretierten Sprache, der zu den unterschiedlichen Ergebnissen dieser Operation führt? 🎜 Das obige ist der detaillierte Inhalt vonPHP erweitert eine positive ganze Zahl am effizientesten um das Tausendfache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!