Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Классы против массивов 2D
Что лучше использовать в PHP, массиве 2D или классе? Я включил пример того, что я имею в виду под этим.
// Using a class
class someClass
{
public $name;
public $height;
public $weight;
function __construct($name, $height, $weight)
{
$this -> name = $name;
$this -> height = $height;
$this -> weight = $weight;
}
}
$classArray[1] = new someClass('Bob', 10, 20);
$classArray[2] = new someClass('Fred', 15, 10);
$classArray[3] = new someClass('Ned', 25, 30);
// Using a 2D array
$normalArray[1]['name'] = 'Bob';
$normalArray[1]['height'] = 10;
$normalArray[1]['weight'] = 20;
$normalArray[2]['name'] = 'Fred';
$normalArray[2]['height'] = 15;
$normalArray[2]['weight'] = 10;
$normalArray[3]['name'] = 'Ned';
$normalArray[3]['height'] = 25;
$normalArray[3]['weight'] = 30;
Предполагая, что кто-то не выйдет и не покажет, что классы слишком медленные, похоже, что класс выигрывает.
Я не знаю, какой ответ я должен принять, чтобы я только что проголосовал за них всех.
И теперь я написал две почти идентичные страницы, одну с использованием массива 2D (написанного до публикации этого вопроса), а теперь один использует класс, и я должен сказать, что класс производит гораздо более приятный код. Я понятия не имею, сколько накладных расходов будет сгенерировано, но я сомневаюсь, что это будет конкурировать с улучшением самого кода.
Спасибо, что помогли мне стать лучшим программистом.
"class", который вы построили выше, - это то, для чего большинство людей использовали бы структуру в других языках. Я не уверен, каковы последствия для производительности в PHP, хотя подозреваю, что создание экземпляров объектов здесь, вероятно, более затратно, хотя бы немного.
Тем не менее, если стоимость относительно низкая, то, на мой взгляд, управлять объектами будет немного легче.
Я говорю только следующее, основываясь на названии и вашем вопросе, но:
Имейте в виду, что классы обеспечивают преимущество методов и контроля доступа, а также. Поэтому, если вы хотите убедиться, что люди не меняют вес на отрицательные числа, вы можете сделать поле weight закрытым и предоставить некоторые методы доступа, такие как getWeight() и setWeight() . Внутри setWeight() вы можете сделать некоторую проверку значений, например:
public function setWeight($weight)
{
if($weight >= 0)
{
$this->weight = $weight;
}
else
{
// Handle this scenario however you like
}
}
Это скорость, о которой я думаю в основном, для чего-то более сложного, чем то, что у меня есть здесь, я бы, вероятно, пошел с классами, но вопрос в том, какова стоимость класса?
Это скорость, о которой я думаю в основном, для чего-то более сложного, чем то, что у меня есть здесь, я бы, вероятно, пошел с классами, но вопрос в том, какова стоимость класса?
Такая оптимизация представляется преждевременной. В любом случае ваше приложение не получит никакого реального снижения производительности, но использование класса позволяет использовать методы getter и setter и, как правило, будет лучше для инкапсуляции кода и повторного использования кода.
С массивами вы несете затраты на более сложное чтение и обслуживание кода, Вы не можете так же легко тестировать модульный код, а с хорошей структурой классов другим разработчикам будет легче понять, если им нужно будет взять его на себя.
И когда позже вам нужно будет добавить другие методы для управления ими, у вас не будет архитектуры для расширения.
Класс, который у вас есть, не является реальным классом в терминах OO - он просто был сконструирован, чтобы занять пространство переменных экземпляра.
Тем не менее - там, вероятно, не так много проблем со скоростью - это просто стильная вещь в вашем примере.
Самый интересный бит - это если вы contsrtucted объект, чтобы быть реальным классом "person" - и thinkng о других атрибутах и действиях, которые вы можете хотеть от класса person-то вы заметите не только стиль производительности-написание кода-но и скорость работы.
Большинство тестов, которые время массивы против классов только тестируют экземпляр их. Как только вы действительно начнете что-то с ними делать.
Я был "purist", который использовал только массивы, потому что производительность была SO намного лучше. Я написал следующий код, чтобы оправдать себя, чтобы оправдать дополнительные хлопоты, связанные с неиспользованием классов (хотя они легче для программиста)
Скажем так, я был VERY удивлен результатами!
<?php
$rx = "";
$rt = "";
$rf = "";
$ta = 0; // total array time
$tc = 0; // total class time
// flip these to test different attributes
$test_globals = true;
$test_functions = true;
$test_assignments = true;
$test_reads = true;
// define class
class TestObject
{
public $a;
public $b;
public $c;
public $d;
public $e;
public $f;
public function __construct($a,$b,$c,$d,$e,$f)
{
$this->a = $a;
$this->b = $b;
$this->c = $c;
$this->d = $d;
$this->e = $e;
$this->f = $f;
}
public function setAtoB()
{
$this->a = $this->b;
}
}
// begin test
echo "<br>test reads: " . $test_reads;
echo "<br>test assignments: " . $test_assignments;
echo "<br>test globals: " . $test_globals;
echo "<br>test functions: " . $test_functions;
echo "<br>";
for ($z=0;$z<10;$z++)
{
$starta = microtime(true);
for ($x=0;$x<100000;$x++)
{
$xr = getArray('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');
if ($test_assignments)
{
$xr['e'] = "e";
$xr['c'] = "sea biscut";
}
if ($test_reads)
{
$rt = $x['b'];
$rx = $x['f'];
}
if ($test_functions) { setArrAtoB($xr); }
if ($test_globals) { $rf = glb_arr(); }
}
$ta = $ta + (microtime(true)-$starta);
echo "<br/>Array time = " . (microtime(true)-$starta) . "\n\n";
$startc = microtime(true);
for ($x=0;$x<100000;$x++)
{
$xo = new TestObject('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');
if ($test_assignments)
{
$xo->e = "e";
$xo->c = "sea biscut";
}
if ($test_reads)
{
$rt = $xo->b;
$rx = $xo->f;
}
if ($test_functions) { $xo->setAtoB(); }
if ($test_globals) { $xf = glb_cls(); }
}
$tc = $tc + (microtime(true)-$startc);
echo "<br>Class time = " . (microtime(true)-$startc) . "\n\n";
echo "<br>";
echo "<br>Total Array time (so far) = " . $ta . "(100,000 iterations) \n\n";
echo "<br>Total Class time (so far) = " . $tc . "(100,000 iterations) \n\n";
echo "<br>";
}
echo "TOTAL TIMES:";
echo "<br>";
echo "<br>Total Array time = " . $ta . "(1,000,000 iterations) \n\n";
echo "<br>Total Class time = " . $tc . "(1,000,000 iterations)\n\n";
// test functions
function getArray($a,$b,$c,$d,$e,$f)
{
$arr = array();
$arr['a'] = $a;
$arr['b'] = $b;
$arr['c'] = $c;
$arr['d'] = $d;
$arr['d'] = $e;
$arr['d'] = $f;
return($arr);
}
//-------------------------------------
function setArrAtoB($r)
{
$r['a'] = $r['b'];
}
//-------------------------------------
function glb_cls()
{
global $xo;
$xo->d = "ddxxdd";
return ($xo->f);
}
//-------------------------------------
function glb_arr()
{
global $xr;
$xr['d'] = "ddxxdd";
return ($xr['f']);
}
//-------------------------------------
?>
тест читает: 1 тестовые задания: 1 тестовые глобалы: 1 функции теста: 1
Время время = 1.58905816078 Время занятий = 1.11980104446 Общее время массива (пока) = 1.58903813362(100,000 итераций) Общее время класса (пока) = 1.11979603767(100,000 итераций)
Время время = 1.02581000328 Время занятий = 1.22492313385 Общее время массива (пока) = 2.61484408379(100,000 итераций) Общее время класса (пока) = 2.34471416473(100,000 итераций)
Время время = 1.29942297935 Время занятий = 1.18844485283 Общее время массива (пока) = 3.91425895691(100,000 итераций) Общее время класса (пока) = 3.5331492424(100,000 итераций)
Время время = 1.28776097298 Время занятий = 1.02383089066 Общее время массива (пока) = 5.2020149231(100,000 итераций) Общее время класса (пока) = 4.55697512627(100,000 итераций)
Время время = 1.31235599518 Время занятий = 1.38880181313 Общее время массива (пока) = 6.51436591148(100,000 итераций) Общее время класса (пока) = 5.94577097893(100,000 итераций)
Время время = 1.3007349968 Время занятий = 1.07644081116 Общее время массива (пока) = 7.81509685516(100,000 итераций) Общее время класса (пока) = 7.02220678329(100,000 итераций)
Время время = 1.12752890587 Время занятий = 1.07106018066 Общее время массива (пока) = 8.94262075424(100,000 итераций) Общее время класса (пока) = 8.09326195717(100,000 итераций)
Время время = 1.08890199661 Время занятий = 1.09139609337 Общее время массива (пока) = 10.0315177441(100,000 итераций) Общее время класса (пока) = 9.18465089798(100,000 итераций)
Время время = 1.6172170639 Время занятий = 1.14714384079 Общее время массива (пока) = 11.6487307549(100,000 итераций) Общее время класса (пока) = 10.3317887783(100,000 итераций)
Время время = 1.53738498688 Время занятий = 1.28127002716 Общее время массива (пока) = 13.1861097813(100,000 итераций) Общее время класса (пока) = 11.6130547523(100,000 итераций)
ОБЩЕЕ ВРЕМЯ: Общее время массива = 13.1861097813(1,000,000 итераций) Общее время класса = 11.6130547523(1,000,000 итераций)
Так что в любом случае разница довольно незначительна. Я был очень удивлен, обнаружив, что как только вы начинаете получать доступ к вещам глобально, классы на самом деле становятся немного быстрее.
Но не доверяй мне, сделай это для себя. Я лично теперь чувствую себя полностью свободным от чувства вины за использование классов в моих высокопроизводительных приложениях. :Д
Тейфион, если вы используете классы как простую замену массивов, вы далеко не приближаетесь к OOP. Суть OOP состоит в том, что объекты обладают знаниями и ответственностью, могут реально делать вещи и сотрудничать с другими классами. Ваши объекты обладают только знаниями и не могут делать ничего другого, кроме как праздно существовать, однако они кажутся хорошими кандидатами для поставщиков сохраняемости (объекты, которые знают, как хранить/извлекать себя в/из базы данных).
Не беспокойтесь и о производительности. Объекты в PHP быстры и легки, а производительность в целом сильно переоценена. Дешевле экономить свое время как программиста, используя правильный подход, чем экономить микросекунды в вашей программе с каким-то непонятным, трудно отлаживаемым и исправляемым фрагментом кода.
@Richard варно
Я запустил ваш точный код (после исправления небольших ошибок), и получил гораздо другие результаты, чем вы. Классы много работали на моей установке PHP 5.3.17.
Время время = 0.69054913520813 Время занятий = 1.1762700080872
Общее время массива (пока) = 0.69054508209229(100,000 итераций) Общее время занятий (пока) = 1.1762590408325(100,000 итераций)
Время время = 0.99001502990723 Время занятий = 1.22034907341
Общее время массива (пока) = 1.6805560588837(100,000 итераций) Общее время занятий (пока) = 2.3966031074524(100,000 итераций)
Время время = 0.99191808700562 Время занятий = 1.2245700359344
Общее время массива (пока) = 2.6724660396576(100,000 итераций) Общее время занятий (пока) = 3.6211669445038(100,000 итераций)
Время время = 0.9890251159668 Время занятий = 1.2246470451355
Общее время массива (пока) = 3.661484003067(100,000 итераций) Общее время занятий (пока) = 4.8458080291748(100,000 итераций)
Время время = 0.99573588371277 Время занятий = 1.1242771148682
Общее время массива (пока) = 4.6572148799896(100,000 итераций) Общее время занятий (пока) = 5.9700801372528(100,000 итераций)
Время время = 0.88518786430359 Время занятий = 1.1427340507507
Общее время массива (пока) = 5.5423986911774(100,000 итераций) Общее время занятий (пока) = 7.1128082275391(100,000 итераций)
Время время = 0.87605404853821 Время занятий = 0.95899105072021
Общее время массива (пока) = 6.4184486865997(100,000 итераций) Общее время занятий (пока) = 8.0717933177948(100,000 итераций)
Время время = 0.73414516448975 Время занятий = 1.0223190784454
Общее время массива (пока) = 7.1525888442993(100,000 итераций) Общее время занятий (пока) = 9.0941033363342(100,000 итераций)
Время время = 0.95230412483215 Время занятий = 1.059828042984
Общее время массива (пока) = 8.1048839092255(100,000 итераций) Общее время занятий (пока) = 10.153927326202(100,000 итераций)
Время время = 0.75814390182495 Время занятий = 0.84455919265747
Общее время массива (пока) = 8.8630249500275(100,000 итераций) Общее время занятий (пока) = 10.998482465744(100,000 итераций) ОБЩЕЕ ВРЕМЯ:
Общее время время = 8.8630249500275(1,000,000 итераций) Общее время занятий = 10.998482465744(1,000000 итераций)