Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931

Интересно будет выслушать рекомендации по поводу...

21.10.2008, 17:07. Показов 1044. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
hi, народ.

Вот тут такое дело забабахал. Ничего особенно сложного - XML through SAX -> Java object creation.

И вот меня интересуют возможные пути оптимизации кода (и вообще в этом роде). Потому что будет это все бегать в application server и желательно не иметь тормозов тут, а то на основной рабочий workspace web-app уже и так выкладываются результаты работы 4 бинов. Сами понимаете... А разделить их на экраны нельзя, нужно иметь общую картинку сразу.

Значит, в 2 словах о коде: NasaqQuery - обычный тестер для других классов. StockQuote - value object, который будет перегоняться между web-server & AS. StockQuoteBuilder - собственно, предмет топика - SAX content handler.

Сначала сырцы всех 3, а затем вопросы...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.10.2008, 17:07
Ответы с готовыми решениями:

Рекомендации по поводу ускорения системы
Здравсвтуйте , использую debian совсем недавно , очень нравится система , так хорошо установилась никаких проблем с драйвером моей видяхи ,...

Очень интересно ваше мнение по поводу железа которое я себе подобрал=)
Очень интересно ваше мнение по поводу железа которое я себе подобрал=) Ксати вот и оно: Корпус ZALMAN Z9 Black w/o PSU 1 768р....

Интересно что будет дальше..
Вот сижу ,читаю топики и думаю,а что будет дальше,ну не в глобальном смысле,а с Яшей,что еще можно придумать,чтобы оценить релевантность...

8
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
21.10.2008, 17:08  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
/*
 * NasdaqQuery.java
 *
 * Created on 12 August 2002, 14:24
 */
 
/**
 *
 * @author  Andrew Perepelytsya
 */
public class NasdaqQuery {
 
    private static final String SERVER_URI = 'http://quotes.nasdaq.com/quote.dll?page=xml&mode=stock&symbol=';
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        // create a SAX parser through JAXP
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        
        // set content handler
        StockQuoteBuilder stockQuoteBuilder = new StockQuoteBuilder();
        parser.parse(sendRequest(args[0]), stockQuoteBuilder);
        
        StockQuote quote = stockQuoteBuilder.getStockQuote();
    }
    
    private static InputStream sendRequest(String symbol) throws MalformedURLException, IOException {
        URL url = new URL(SERVER_URI + symbol);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        
        return conn.getInputStream();
    }
}
0
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
21.10.2008, 17:08  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import java.io.Serializable;
 
/*
 * StockQuoteBean.java
 *
 * Created on 12 August 2002, 19:34
 */
 
/**
 *
 * @author  Andrew Perepelytsya
 */
public class StockQuote implements Serializable {
    
    private String issueName;
    
    private String symbol;
    
    private String issuerWebSiteUrl;
    
    private String issuerLogoUrl;
    
    private double todaysHighPrice;
    
    private double todaysLowPrice;
    
    private double _52weekHighPrice;
    
    private double _52weekLowPrice;
    
    private double lastSalePrice;
    
    private double netChangePrice;
    
    private int shareVolumeQuantity;
    
    private double previousClosePrice;
    
    private double netChangePercent;
    
    private String tradeDateTime;
    
    /** Getter for property _52weekHighPrice.
     * @return Value of property _52weekHighPrice.
     */
    public double get_52weekHighPrice() {
        return _52weekHighPrice;
    }
    
    /** Setter for property _52weekHighPrice.
     * @param _52weekHighPrice New value of property _52weekHighPrice.
     */
    public void set_52weekHighPrice(double _52weekHighPrice) {
        this._52weekHighPrice = _52weekHighPrice;
    }
    
    /** Getter for property _52weekLowPrice.
     * @return Value of property _52weekLowPrice.
     */
    public double get_52weekLowPrice() {
        return _52weekLowPrice;
    }
    
    /** Setter for property _52weekLowPrice.
     * @param _52weekLowPrice New value of property _52weekLowPrice.
     */
    public void set_52weekLowPrice(double _52weekLowPrice) {
        this._52weekLowPrice = _52weekLowPrice;
    }
    
    /** Getter for property issueName.
     * @return Value of property issueName.
     */
    public String getIssueName() {
        return issueName;
    }
    
    /** Setter for property issueName.
     * @param issueName New value of property issueName.
     */
    public void setIssueName(String issueName) {
        this.issueName = issueName;
    }
    
    /** Getter for property issuerLogoUrl.
     * @return Value of property issuerLogoUrl.
     */
    public String getIssuerLogoUrl() {
        return issuerLogoUrl;
    }
    
    /** Setter for property issuerLogoUrl.
     * @param issuerLogoUrl New value of property issuerLogoUrl.
     */
    public void setIssuerLogoUrl(String issuerLogoUrl) {
        this.issuerLogoUrl = issuerLogoUrl;
    }
    
    /** Getter for property issuerWebSiteUrl.
     * @return Value of property issuerWebSiteUrl.
     */
    public String getIssuerWebSiteUrl() {
        return issuerWebSiteUrl;
    }
    
    /** Setter for property issuerWebSiteUrl.
     * @param issuerWebSiteUrl New value of property issuerWebSiteUrl.
     */
    public void setIssuerWebSiteUrl(String issuerWebSiteUrl) {
        this.issuerWebSiteUrl = issuerWebSiteUrl;
    }
    
    /** Getter for property lastSalePrice.
     * @return Value of property lastSalePrice.
     */
    public double getLastSalePrice() {
        return lastSalePrice;
    }
    
    /** Setter for property lastSalePrice.
     * @param lastSalePrice New value of property lastSalePrice.
     */
    public void setLastSalePrice(double lastSalePrice) {
        this.lastSalePrice = lastSalePrice;
    }
    
    /** Getter for property netChangePrice.
     * @return Value of property netChangePrice.
     */
    public double getNetChangePrice() {
        return netChangePrice;
0
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
21.10.2008, 17:08  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import java.util.Stack;
import java.util.Collection;
import java.util.ArrayList;
 
/*
 * StockQuoteBuilder.java
 *
 * Created on 12 August 2002, 19:18
 */
 
/**
 *
 * @author  Andrew Perepelytsya
 */
public class StockQuoteBuilder extends DefaultHandler {
    
    private StockQuote quote;
    
    private Stack stack;
    
    private static final String NODE_EQUITY_QUOTE = 'equity-quote';
    private static final String NODE_ISSUE_NAME = 'issue-name';
    private static final String NODE_ISSUER_LOGO_URL = 'issuer-logo-url';
    private static final String NODE_ISSUER_WEB_SITE_URL = 'issuer-web-site-url';
    private static final String NODE_52_WEEK_HIGH_PRICE = 'fifty-two-wk-high-price';
    private static final String NODE_52_WEEK_LOW_PRICE = 'fifty-two-wk-low-price';
    private static final String NODE_LAST_SALE_PRICE = 'last-sale-price';
    private static final String NODE_NET_CHANGE_PRICE = 'net-change-price';
    private static final String NODE_NET_CHANGE_PERCENT = 'net-change-pct';
    private static final String NODE_PREVIOUS_CLOSE_PRICE = 'previous-close-price';
    private static final String NODE_SHARE_VOLUME_QUANTITY = 'share-volume-qty';
    private static final String NODE_TODAYS_HIGH_PRICE = 'todays-high-price';
    private static final String NODE_TODAYS_LOW_PRICE = 'todays-low-price';
    private static final String NODE_TRADE_DATETIME = 'trade-datetime';
    
    private static final Collection requiredNodes = new ArrayList();
    
    static {
        requiredNodes.add(NODE_52_WEEK_HIGH_PRICE);
        requiredNodes.add(NODE_52_WEEK_LOW_PRICE);
        requiredNodes.add(NODE_ISSUER_LOGO_URL);
        requiredNodes.add(NODE_ISSUER_WEB_SITE_URL);
        requiredNodes.add(NODE_ISSUE_NAME);
        requiredNodes.add(NODE_LAST_SALE_PRICE);
        requiredNodes.add(NODE_NET_CHANGE_PERCENT);
        requiredNodes.add(NODE_NET_CHANGE_PRICE);
        requiredNodes.add(NODE_PREVIOUS_CLOSE_PRICE);
        requiredNodes.add(NODE_SHARE_VOLUME_QUANTITY);
        requiredNodes.add(NODE_TODAYS_HIGH_PRICE);
        requiredNodes.add(NODE_TODAYS_LOW_PRICE);
        requiredNodes.add(NODE_TRADE_DATETIME);
    }
    
    public void characters(char[] values, int start, int length) throws SAXException {
        String node = null;
        if (!stack.empty()) {
            node = (String)stack.peek();
            
            if (!requiredNodes.contains(node)) return;
            
            if (node == NODE_ISSUE_NAME)
                quote.setIssueName(new String(values, start, length));
            
            else if (node == NODE_TODAYS_HIGH_PRICE)
                quote.setTodaysHighPrice(Double.parseDouble(new String(values, start, length)));
            
            else if (node == NODE_TODAYS_LOW_PRICE)
                quote.setTodaysLowPrice(Double.parseDouble(new String(values, start, length)));
            
            else if (node == NODE_52_WEEK_HIGH_PRICE) 
                quote.set_52weekHighPrice(Double.parseDouble(new String(values, start, length)));
            
            else if (node == NODE_52_WEEK_LOW_PRICE)
                quote.set_52weekLowPrice(Double.parseDouble(new String(values, start, length)));
                
            else if (node == NODE_LAST_SALE_PRICE)
                quote.setLastSalePrice(Double.parseDouble(new Str
0
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
21.10.2008, 17:25  [ТС]
Значит, чтобы иметь представление, с чем мы работаем:

http://quotes.nasdaq.com/quote.dll?page=xml&mode=stock&symbol=

и дописываем биржевой индекс в урлу. Дабы упростить задачу, дам несколько:

Cisco Systems - CSCO
Melkosoft - MSFT
Sun Microsystems - SUNW
ibm, dell - одноименные.

Я бере не все тэги из response, только относящиеся к делу. Их мы и заносим в requiredNodes.

Итак, строка:

private static final Collection requiredNodes = new ArrayList();

По логике можно сделать и Set. Реально мне это ничего не дает, поскольку набор тегов в runtime не изменяется. (тут идут ваши мнения, флеймы, одобрения, опровержения и т.д.)

Использовал collections, потому что было удобно.

Для оптимизации кода есть идея загнать все в обычный array, сделать его static final. Затем сделать Arrays.sort(requiredNodes) , а дальнейшую проверку на пригодность производить через Arrays.binarySearch(requiredNodes) Возвращает по идее -1, если такого элемента нет.

У Eckel'я я не нашел особого разъяснения по скорости работы именно этих методов.

Дальше. StockQuoteBuilder будет сделан dependant class of Stateless Session Bean. Кешировать инфу не имеет смысла, так как данные обновляются каждые минут 10-20, а точки отсчета у меня нет (да это и нереально). Или имеет смысл скешировать его, скажем, на web-server в ServletContext, и обновлять его, скажем каждые _5_ минут через scheduler (ну и выключать его на ночь, когда нем торгов).
Любые посты на эту тему приветствуются.

Пока, пожалуй хватит вопросов, посмотрим как будет реакция
0
Sergey_
21.10.2008, 17:46
По поводу последнего файла. Первым делом бросается в глаза, что сравнение типа
if (node == NODE_ISSUE_NAME)
совершенно некорректно. Будут сравниваться ссылки, а не объекты. Нужно писать node.equals(NODE_ISSUE_NAME)

И Вообще весь этот длинный if-then-else смотрится как-то... Хорошо бы вместо строковых констант использовать числовые, и переделать его в switch-case.
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
21.10.2008, 17:52  [ТС]
Для начала - спасибо за быстрый ответ

Далее. Поскольку все NODES идут как константы (static final), то такие сравнения работают. (Это один из заковыристых вопросов на сертификацию, кстати Именно поэтому я и запостил все классы, чтобы можно было проверить работоспособность. Нерабочий код я бы не слал.

Насчет switch. Это я сам думал. Но иметь двойное переназначение констант - как-то коряво, запутывает и не добавляет скорости. Хотя попробуйте меня исправить
0
Sergey_
21.10.2008, 18:26
Программа особо не усложнится, если мы будем использовать инты вместо стрингов. Просто в определениях констант нужно заменить стринги на инты, а вместо ArrayList использовать к примеру HashMap, в которой ссылаться на эти интовые константы. Ну и в стэк класть нужно наверно Integer. Ну понятно короче...

По теории, заменив if-then-else на switch мы должны выиграть в скорости, так как switch реализуется таким образом, что мы попадаем на нужный case, не тратя время на все остальные варианты (а их довольно много!).

Я не уверен на 100%, что это все реально ускорит программу. Но мне кажется, стоит попробовать этот вариант.
Sergey_
21.10.2008, 19:31
По поводу оптимальности выбора ArrayList. В контейнер ничего не добавляется и не удаляется. Единственная операция - поиск.

В ArrayList поиск выполняется за O(n) операций (n - длина списка). Это не очень хорошо.
Например, в HashSet время поиска - константа. Может быть лучше использовать этот контейнер (или HashMap, если согласиться с моим предыдущим постом и делать switch).

Впрочем, может быть я и не прав. Элементов в списке не очень много и преимущество HashSet может оказаться непринципиальным. Нужно проверить.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2008, 19:31
Помогаю со студенческими работами здесь

Думаю вам будет интересно)
Вот нашол интересную штучку думаю вам будет интересно потикать в пару кнопочек,игрушка занятная.Жаль тока что автора нету.

Класс TThread (новичкам будет интересно)
Доброе утро! Юзал вчера потоки. Конкретно интересовал вопрос передачи структуры данных типа TObject из потока в главную программу. У...

Интересно тут кто-нить будет ?
Давай те все на Линукс и переименуем RELIB.COM в RELIB-LINUX.COM ;-))))) Думаю СМАЛИГ не обидится.

как думаете интересно будет сделать радиолокатор?
как думаете интересно будет сделать радиолокатор?

Исчезновение интернета в Windows XP SP3! Будет интересно
Ребята всем привет! Жесть, в общем букавак будет много поэтому у кого нет времени проходим не стесняемся. Windows XP SP3 подключен к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru