Производительность NSEnumerator по сравнению с для цикла в Какао

Ответ @Gabe Martin-Dempesy мне помогает. И я написал небольшой сценарий, связанный с ним.

Установить сертификат с хоста:

> sudo ./java-cert-importer.sh example.com

Удалить уже установленный сертификат.

> sudo ./java-cert-importer.sh example.com --delete

java-cert- importer.sh

#!/usr/bin/env bash

# Exit on error
set -e

# Ensure script is running as root
if [ "$EUID" -ne 0 ]
  then echo "WARN: Please run as root (sudo)"
  exit 1
fi

# Check required commands
command -v openssl >/dev/null 2>&1 || { echo "Required command 'openssl' not installed. Aborting." >&2; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo "Required command 'keytool' not installed. Aborting." >&2; exit 1; }

# Get command line args
host=$1; port=${2:-443}; deleteCmd=${3:-${2}}

# Check host argument
if [ ! ${host} ]; then
cat << EOF
Please enter required parameter(s)

usage:  ./java-cert-importer.sh <host> [ <port> | default=443 ] [ -d | --delete ]

EOF
exit 1
fi;

if [ "$JAVA_HOME" ]; then
    javahome=${JAVA_HOME}
elif [[ "$OSTYPE" == "linux-gnu" ]]; then # Linux
    javahome=$(readlink -f $(which java) | sed "s:bin/java::")
elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS X
    javahome="$(/usr/libexec/java_home)/jre"
fi

if [ ! "$javahome" ]; then
    echo "WARN: Java home cannot be found."
    exit 1
elif [ ! -d "$javahome" ]; then
    echo "WARN: Detected Java home does not exists: $javahome"
    exit 1
fi

echo "Detected Java Home: $javahome"

# Set cacerts file path
cacertspath=${javahome}/lib/security/cacerts
cacertsbackup="${cacertspath}.$$.backup"

if ( [ "$deleteCmd" == "-d" ] || [ "$deleteCmd" == "--delete" ] ); then
    sudo keytool -delete -alias ${host} -keystore ${cacertspath} -storepass changeit
    echo "Certificate is deleted for ${host}"
    exit 0
fi

# Get host info from user
#read -p "Enter server host (E.g. example.com) : " host
#read -p "Enter server port (Default 443) : " port

# create temp file
tmpfile="/tmp/${host}.$$.crt"

# Create java cacerts backup file
cp ${cacertspath} ${cacertsbackup}

echo "Java CaCerts Backup: ${cacertsbackup}"

# Get certificate from speficied host
openssl x509 -in <(openssl s_client -connect ${host}:${port} -prexit 2>/dev/null) -out ${tmpfile}

# Import certificate into java cacerts file
sudo keytool -importcert -file ${tmpfile} -alias ${host} -keystore ${cacertspath} -storepass changeit

# Remove temp certificate file
rm ${tmpfile}

# Check certificate alias name (same with host) that imported successfully
result=$(keytool -list -v -keystore ${cacertspath} -storepass changeit | grep "Alias name: ${host}")

# Show results to user
if [ "$result" ]; then
    echo "Success: Certificate is imported to java cacerts for ${host}";
else
    echo "Error: Something went wrong";
fi;
18
задан The Archetypal Paul 10 November 2008 в 16:12
поделиться

2 ответа

Используя новое for (... in ...) синтаксис в Objective C 2.0 обычно является самым быстрым способом выполнить итерации по набору, потому что он может поддержать буфер на стеке и получить пакеты объектов в него.

Используя NSEnumerator обычно самый медленный путь, потому что он часто копирует выполняемый с помощью итераций набор; для неизменных наборов это может быть дешево (эквивалентный -retain), но для изменяемых наборов это может заставить неизменную копию быть созданной.

Выполнение Вашего собственного повторения —, например, с помощью -[NSArray objectAtIndex:] — будет обычно падать где-нибудь промежуточный, потому что, в то время как у Вас не будет копирования потенциала наверху, Вы также не будете получать пакеты объектов от базового набора.

(PS - Этот вопрос должен быть отмечен как Objective C, не C, с тех пор NSEnumerator, класс Какао и новое for (... in ...), синтаксис характерен для Objective C.)

27
ответ дан 30 November 2019 в 07:34
поделиться

Они очень похожи. С Objective C 2.0 большинство перечислений теперь значение по умолчанию к NSFastEnumeration, который создает буфер адресов к каждому объекту в наборе, который это может затем поставить. Один шаг, который Вы сохраняете по классику для цикла, не должен звонить objectAtIndex:i каждый раз в цикле. Внутренности набора Вы перечисляете реализацию быстрое перечисление с вызовом objectAtIndex:i method.

буфер является частью причины, что Вы не можете видоизменить набор, как Вы перечисляете, адрес объектов изменится и буфер, который был создан, больше не будет соответствовать.

В качестве награды формат в 2,0 взглядах, столь же хороших как классик для цикла:

for ( Type newVariable in expression ) { 
    stmts 
}

Read следующий documentaion для движения глубже: Ссылка на протокол NSFastEnumeration

2
ответ дан 30 November 2019 в 07:34
поделиться