パフォーマンスを向上させるために、C 標準ライブラリ (glibc) にいくつかの変更を加える必要があります。具体的には、strcoll
.
glibc ソースをhereから にチェックアウトしました~/Desktop/glibc
。次に、次の一連のコマンドをエラーなしで実行しました。
$ cd ~/Desktop
$ mkdir bglibc
$ cd bglibc
$ ./../glibc/configure --prefix=~/Desktop/bglibc
$ make
$ make install
この時点で、glibc のコンパイルとインストールに成功しました~/Desktop/bglibc
。ct.c
次に、bglibc ディレクトリに次のテスト プログラム ( ) を作成しました。
#include <stdio.h>
#include <locale.h>
int main ()
{
char *locale = NULL;
locale = "en_US.utf8";
char *result = setlocale(LC_COLLATE, locale);
if (result == NULL) {
printf("locale not set\n");
}
printf("strcoll: %d\n", strcoll("some", "string"));
return 0;
}
次に、次のスクリプトでビルドします。
iSYSROOT=~/Desktop/bglibc
gcc -o ct ct.c \
--sysroot=${SYSROOT} \
-Wl,-rpath=${SYSROOT}/lib \
-Wl,--dynamic-linker=${SYSROOT}/lib/ld.so.1
それを適切に構築します。次に、次のスクリプトで実行します。
#!/bin/sh
builddir=`dirname "$0"`
GCONV_PATH="${builddir}/iconvdata" \
exec "${builddir}"/elf/ld-linux-x86-64.so.2 --library-path "${builddir}":"${builddir}"/*:"${builddir}"/*/*:"${builddir}"/*/*/* ${1+"$@"}
これは名前testrun.sh
です。以前にコンパイルしたプログラム ( ct
) で実行するには、 を実行し./testrun.sh ./ct
ます。
これによりプログラムは正常に実行されますが、プログラムは を出力します。locale not set
これは、ロケールを に設定できなかったことを意味します"en_US.utf8"
。したがって、ロケールはデフォルトの ( "C"
) を保持します。この場合strcoll
、単純に の結果を返しますstrcmp
。ただし、strcoll
パフォーマンスのテストを実行するためにコードを実行し、特定のロケールでより高速に実行するように調整するには、この呼び出しが必要です。
これが私のシステム(Ubuntu 12.04 lts)の有効なロケールであることはわかってい"en_US.utf8"
ます。
$ locale -a | grep US
en_US.utf8
私もこのプログラムを実行しようとしましたが、ロケール変数を"en_US.UTF-16
" ""
、、、などの他の文字列に設定しましたが"en_US.UTF-8"
、うまくいきませんでした。
これは、変更されたバージョンの glibc でロケール関連のものを動作させようとするときに遭遇する最初の問題ではないと思いますが、最初の問題です。
setlocale
ロケール機能(具体的には)を正しく機能させるために何ができるかについてのアイデアはありますか?