извините я - новичок, и я не могу определить, насколько хороший вопрос это, возможно, это звучит совершенно очевидным для некоторых из Вас.
если наше использование этих двух ниже является тем же, которое лучше?
function doSomething ($var1,$var2,..){
...
}
ИЛИ
function doSomething (){
global $var1,$var2,..;
...
}
нашим использованием я подразумеваю, что знаю, что во втором сценарии мы можем также изменить значение глобальных переменных. но что, если мы не должны делать этого, которое является лучшим способом записать эту функцию? передающие переменные берут меньше памяти, чем объявление о global's в функции?
Использование памяти - ничтожная проблема. Гораздо важнее, чтобы код было легко читаемым и не давал ... непредсказуемых ... результатов. Добавление глобальных переменных - ОЧЕНЬ ПЛОХАЯ ИДЕЯ с этой точки зрения, ИМО.
Если вас беспокоит использование памяти, то следует сделать следующее:
function doSomething (&$var1, &$var2,..) {
...
}
Это будет передавать переменные по ссылке, а не создавать их новые копии в памяти. Если вы измените их во время выполнения функции, эти изменения будут отражены, когда выполнение вернется к вызывающему.
Однако учтите, что даже это бывает очень необычно по причинам памяти. Обычная причина для использования по ссылке - причина, указанная мной выше (изменение их для вызывающего). Практически всегда путь простой
function doSomething ($var1, $var2) {
...
}
Недавно я написал запись в блоге, в которой объясняется , как получить время в миллисекундах между платформами .
Он будет работать как время (NULL), но будет возвращать количество миллисекунд вместо секунд из эпохи Unix в окнах и Linux.
#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif
/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
* windows and linux. */
int64 GetTimeMs64()
{
#ifdef WIN32
/* Windows */
FILETIME ft;
LARGE_INTEGER li;
uint64 ret;
/* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
* to a LARGE_INTEGER structure. */
GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
ret = li.QuadPart;
ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */
return ret;
#else
/* Linux */
struct timeval tv;
uint64 ret;
gettimeofday(&tv, NULL);
ret = tv.tv_usec;
/* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
ret /= 1000;
/* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
ret += (tv.tv_sec * 1000);
return ret;
#endif
}
Вы можете изменить его, чтобы вернуть микросекунды вместо миллиэсконд, если хотите.
-121--3159594-Запишите его для получения параметров. Ремонтопригодность гораздо важнее микрооптимизации. При выборе параметров переменные нельзя изменять в неожиданных местах.
-121--2245987-Избегайте использования глобальных переменных, вместо этого используйте переходящие переменные в подходе параметров. В зависимости от размера программы производительность может быть незначительной.
Но если вы заинтересованы в производительности, вот некоторые ключевые вещи, которые следует отметить о производительности глобальных переменных в отношении локальных переменных (переменные, определенные в функциях.)
Кроме того, глобальные переменные увеличивают риск использования неправильных значений, если они были изменены в другом месте кода.
Передайте параметры, избегайте глобальных переменных. Сохранение только той области действия, которая вам нужна для данной ситуации, - это показатель хорошего дизайна кода. Вы можете посмотреть на область видимости переменных PHP ...
http://php.net/manual/en/language.variables.scope.php
Отличный ресурс с некоторыми указателями на то, что является передовым опытом и управление памятью.
Хэш-таблица
реализует карту
. Функция Map.entureSet
возвращает коллекцию ( Set
) экземпляров Map.Entry
, имеющих методы getKey
и getValue
.
Итак:
Iterator<Map.Entry> it;
Map.Entry entry;
it = yourTable.entrySet().iterator();
while (it.hasNext()) {
entry = it.next();
System.out.println(
entry.getKey().toString() + " " +
entry.getValue().toString());
}
Если известны типы записей в хэш-таблице, можно использовать шаблоны для исключения вызовов toString
выше. Например, элемент
может быть объявлен как Map.Entry < Строка, Строка >
, если хэш-таблица объявлена как Хэш-таблица < Строка, Строка >
.
Если вы можете комбинировать шаблоны с дженериками, это просто коротко:
for (Map.Entry<String,String> entry : yourTable.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
Это предполагает, что ваша таблица
является хэш-таблицей < строка, строка >
. Просто покажет, как далеко Ява зашла за последние несколько лет, в значительной степени не потеряв свой существенный Java-ness.
Немного OT: Если синхронизация не требуется, используйте HashMap
вместо Hashtable
. В этом случае используйте ConcurrentHashMap
(спасибо, акаппа!).
Недавно я написал запись в блоге, в которой объясняется как получить время в миллисекундах между платформами .
Он будет работать как время (NULL), но будет возвращать количество миллисекунд вместо секунд из эпохи Unix в окнах и Linux.
#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif
/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
* windows and linux. */
int64 GetTimeMs64()
{
#ifdef WIN32
/* Windows */
FILETIME ft;
LARGE_INTEGER li;
uint64 ret;
/* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
* to a LARGE_INTEGER structure. */
GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
ret = li.QuadPart;
ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */
return ret;
#else
/* Linux */
struct timeval tv;
uint64 ret;
gettimeofday(&tv, NULL);
ret = tv.tv_usec;
/* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
ret /= 1000;
/* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
ret += (tv.tv_sec * 1000);
return ret;
#endif
}
Вы можете изменить его, чтобы вернуть микросекунды вместо миллиэсконд, если хотите.
-121--3159594-Запишите его для получения параметров. Ремонтопригодность гораздо важнее микрооптимизации. При выборе параметров переменные нельзя изменять в неожиданных местах.
Хотя это не очень хорошая практика, если вы гарантируете, что глобальное значение никогда не записывается, а только читается, у вас будет гибкость параметров.
В качестве альтернативы вы можете передать один параметр (или два, если это действительно соответствует функции, например, exp), а остальные в массиве параметров (немного похоже на jquery). Таким образом, вы не используете глобальные переменные, имеете некоторую гибкость параметров и четко определяете значения по умолчанию для каждого параметра.
function get_things($thing_name,$opt= array() {
if(!isset($opt["order"])) $opt["order"]= 'ASC';
}