[Plugin] imessage - очень быстрый доступ к строчкам
#10

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
Код:
  
  if(strncmp(in_language, "ru", 2) == 0)
  {
    conv = iconv_open("CP1251", "UTF8");
  }
  else
  {
     conv = iconv_open("CP1252", "UTF8");
  }
					 
  if(conv == (iconv_t)(-1))
    return;
Я не уверен, но использовать iconv каждый вызов функции GetString на мой взгляд это весьма тормознуто.
Само по себе конвертирование (=побайтовое копирование области памяти), думаю, ни у кого не вызовет вопросов о скорости выполнения. А вот каждый раз вызывать iconv_open() - меня, честно говоря, тоже смущало.. И решение было очевидным - создать несколько полей вида conv1251, conv1252, и вызвать iconv_open() пару раз в конструкторе. Но! После следующего теста такая надобность отпала.

Тест:
PHP код:
#include<stdio.h>
#include<iconv.h>
#include<time.h>
#include<unistd.h>
#include<string.h>
#define CONVERTS 1000000
int main(int argcchar *argv[])
{
  
clock_t tm1tm2;
  
long i;
  
char str[]="самая обычная, не длинная и не короткая строчка, которая отправляется в чат";
  
char buff[256];
  
iconv_t conv;
  
size_t size_insize_out;
  
char *ptr_in, *ptr_out;
  
//тест №1
  
memset(buff0sizeof(buff));
  
tm1 clock();
  
//конвертируем бедную строчку до посинения..
  
for(0CONVERTS; ++i)
  {
    
conv iconv_open("CP1251""UTF8"); //вызываем каждый раз в цикле
    
ptr_in str;
    
size_in strlen(str);
    
ptr_out buff;
    
size_out sizeof(buff);
    
iconv(conv, &ptr_in, &size_in, &ptr_out, &size_out);
    
iconv_close(conv);
  }
  
tm2 clock();
  
fprintf(stderr"результат теста №1 (%d циклов): %.3f сек\n"CONVERTS, (tm2-tm1-0.0)/CLOCKS_PER_SEC);
  
fprintf(stderr"%s\n"str);
  
fprintf(stderr"%s\n"buff);
  
//тест №2
  
memset(buff0sizeof(buff));
  
tm1 clock();
  
conv iconv_open("CP1251""UTF8"); //вызываем один раз перед циклом
  
for(0CONVERTS; ++i)
  {
    
ptr_in str;
    
size_in strlen(str);
    
ptr_out buff;
    
size_out sizeof(buff);
    
iconv(conv, &ptr_in, &size_in, &ptr_out, &size_out);
  }
  
iconv_close(conv);
  
tm2 clock();
  
fprintf(stderr"результат теста №2 (%d циклов): %.3f сек\n"CONVERTS, (tm2-tm1-0.0)/CLOCKS_PER_SEC);
  
fprintf(stderr"%s\n"str);
  
fprintf(stderr"%s\n"buff);
  return 
0;

Результат:


Quote:
Originally Posted by AirKite
Посмотреть сообщение
Что мешает создать глобальный массив и загружать в него соответствующие данные стандартными средствами? Чем данный метод будет быстрее?
Ничего не мешает, ничем не быстрее (большая скорость - если сравнивать со скриптом). Но так удобней! Хотя бы потому, что можно редактировать файл без перезагрузки плагина, и все изменения сразу вступят в силу.
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)