B_BASELINE_POST B_BASELINE_POST Each benchmark focuses on a single issue. Real applications perform many different functions. In order to give you a clear benchmark, these 'baseline' figures will be subtracted from the final statistics for each language. B_BASELINE_PRE B_BASELINE_PRE Applications spend most of their time processing. INTOUCH spends an extra second at startup to set up a complete context. This complete context gives you dramatic performance improvements even over 3GL's. This baseline procedure determines the overhead required on YOUR system to activate and exit images. Each program performs its languages equivalent to an 'exit'. B_IO_BASELINE_POST B_IO_BASELINE_POST In order to give you a clear benchmark, these 'baseline' figures will be subtracted from the final statistics for each language. B_IO_BASELINE_PRE B_IO_BASELINE_PRE This procedure calculates the overhead required on YOUR system to open files (called 'structures' in INTOUCH) in the selected languages. With a simple 'OPEN' statement, INTOUCH gives you the data dictionary power to change the way your data is defined. This involves NO CODE CHANGES. You get 3GL speed and control, plus 4GL power and simplicity. B_READ_POST B_READ_POST INTOUCH uses fewer direct I/Os than other languages to perform reads. The result is that INTOUCH is the ideal environment for I/O intensive applications. INTOUCH handles READS, WRITES and SCREEN I/Os much more efficiently and faster than any other language! B_READ_PRE B_READ_PRE INTOUCH is much more efficient than other languages at handling reads from disk. INTOUCH is typically 5 to 10 times more efficient at handling I/O than other languages. For most applications, reads make up the vast majority of I/Os. This benchmark program reads 1383 records sequentially from disk. Benchmark programs are provided in several languages including INTOUCH. A report follows to display Direct I/Os, CPU Time, and Elapsed Time. This benchmark takes about 1 minute to complete on a VAX 3100. B_REDIM_POST B_REDIM_POST In other languages redimensioning erases any existing information in an array. INTOUCH redimensions the array faster and preserves the data as well. With INTOUCH you can use the convenience of dynamic arrays without bogging down your applications and your system. This convenience translates directly into programmer productivity and more maintainable code. B_REDIM_PRE B_REDIM_PRE Most 3GLs require the programmer to specify a fixed size for each array at compile-time (when the program is written.) If the application needs to store more data than the array was sized for, a fatal error is returned and the application is terminated. INTOUCH, and a few 3GLs, allows you to dynamically redimension arrays at run-time. Thus, the array size can be expanded as needed. INTOUCH optimizes its array redimensioning. This allows arrays to be expanded quickly at run-time, 5 to 10 times faster than traditional 3GLs. This benchmark program will increase the dimensions of an array from 1 element to 4000 elements, expanding the array 10 elements at a time. We have included benchmark programs in BASIC and INTOUCH. This functionality is not available in most languages including C, Cobol, or Fortran. This benchmark takes about 1 minute on a VAX 3100. B_SCREEN_IO_POST B_SCREEN_IO_POST INTOUCH significantly reduces buffered I/Os and CPU time. INTOUCH dramatically improves performance and removes bottlenecks associated with screen I/O and interactive applications. B_SCREEN_IO_PRE B_SCREEN_IO_PRE INTOUCH is typically 50 to 100 times more efficient at performing screen I/O than other languages. The unique, packetized I/O system dramatically reduces buffered I/Os and makes INTOUCH an ideal environment for interactive applications. This benchmark counts from 1 to 1000 and prints each number to the screen in several languages including INTOUCH. A report follows which includes Buffered I/Os, CPU Time, and Elapsed Time on the benchmark for each language. INTOUCH dramatically reduces buffered I/O counts and CPU utilization while handling screen I/O. This benchmark typically completes in less than 1 minute on a VAX 3100. B_UPDATE_POST B_UPDATE_POST INTOUCH dramatically reduces the number of direct I/Os required for typical update operations. This reduction in the number of direct I/Os is due to the unique INTOUCH packetized I/O handling. INTOUCH is the ideal programming environment for I/O intensive applications. B_UPDATE_PRE B_UPDATE_PRE The update process is a very common I/O application. Again INTOUCH is typically 5 to 10 times more efficient at handling I/O operations than other languages. This benchmark will update all of the records in the TTI_RUN:VENDOR file (about 1300 records.) Benchmark programs are provided in several languages including INTOUCH. A report follows to display Direct I/Os, CPU Time, and Elapsed Time for each program. This benchmark takes about 3 minutes to complete on a VAX 3100. B_WRITE_POST B_WRITE_POST INTOUCH uses a small fraction of the direct I/Os compared to other languages when writing data records. Only Digital's optimized FORTRAN matches the I/O performance of INTOUCH when populating an indexed file. Most applications are I/O bound. INTOUCH is the ideal programming environment for I/O intensive applications. B_WRITE_PRE B_WRITE_PRE I/O is the bottleneck on most VAX/VMS systems. INTOUCH is typically 5 to 10 times more efficient at handling I/O than other programming languages. This benchmark program creates an empty indexed file and populates it by writing 200 records of 1255 characters. These characters consist of a 4-character sequential ID number and 1000 text characters consisting of the word "DATA " 200 times. Benchmark programs are provided in several languages including INTOUCH. A report follows to display Direct I/Os, CPU Time, and Elapsed Time for each program. This benchmark takes about 3 minutes to complete on a VAX 3100. DB_SEARCHING_POST DB_SEARCHING_POST INTOUCH's comprehensive indexed field searching capabilities make it ideal for both simple and complex application development. INTOUCH is truly a 4GL built for professional programmers ... yet easy enough for even a novice to master quickly. DB_SEARCHING_PRE DB_SEARCHING_PRE INTOUCH allows data to be searched by any indexed field (key value). Data can be searched by either an exact match or by partial key value. For instance, you can rapidly search for a given name...or a name that begins with a given prefix (all names starting with SYS). Included with all VMS systems is a file called RIGHTSLIST.DAT. This file contains the names of each user (identifier) and each resource on the system. Using INTOUCH, we will ask for an identifier. If a "*" is entered as part of the identifier, we will do a "wildcard" lookup. The INTOUCH code to accomplish this searching task is: SET STRUCTURE RIGHTS, FIELD ID: KEY UNAME$ and EXTRACT STRUCTURE RIGHTS, FIELD ID : PARTIAL KEY LEFT_TEXT$ DB_SELECTING_POST DB_SELECTING_POST INTOUCH's powerful and flexible selection statements make it easy to write applications of any complexity ... without having to resort to calling 3GL routines. With INTOUCH, application development is fast and efficient. DB_SELECTING_PRE DB_SELECTING_PRE INTOUCH allows data to be selected by any field or combination of fields. In addition, INTOUCH allows data to be selected by derived information. For instance, you can select information based on the presence of a letter in a name as well as the length of the name. Included with all VMS systems is a file called RIGHTSLIST.DAT. This file contains the names of each user (identifier) and each resource on the system. Using INTOUCH, we will select identifiers that are between five and eight letters long. In addition, the identifiers must contain the letter "E". The INTOUCH code to accomplish this selection task is: INCLUDE LEN(RIGHTS(ID)) >= 5 AND LEN(RIGHTS(ID)) <= 8 INCLUDE POS(RIGHTS(ID), 'E') > 0 DB_SORTING_POST DB_SORTING_POST INTOUCH's easy-to-learn syntax, coupled with its powerful sorting capabilities, make it ideal for developing both simple and complex applications. DB_SORTING_PRE DB_SORTING_PRE INTOUCH allows data to be sorted by any field or combination of fields. In addition, INTOUCH allows data to be sorted by derived information. For instance, you could sort data by the first letter of a name and, within that, by length of name (shortest names first.) Included with all VMS systems is a file called RIGHTSLIST.DAT. This file contains the names of each user (identifier) and each resource on the system. Using INTOUCH, we will sort by the first letter of each identifier. Within each letter group we will sort by the length of the identifier (shortest names first.) The INTOUCH code to accomplish this sorting task is: SORT BY RIGHTS(ID)[1:1] SORT BY LEN(RIGHTS(ID)) EXIT EXIT F_ASK_POST F_ASK_POST INTOUCH makes data from the operating system readily available. This allows the program to make decisions based on operating system information. Other languages require cumbersome calls to library routines or system services to achieve comparable functionality. INTOUCH typically makes difficult programming tasks very easy. F_ASK_PRE F_ASK_PRE "System Information" tells an application about the system environment the application is running in, i.e. Current Username, Current Default Directory, etc. Many applications require information from the system. In other languages cumbersome calls to external routines are used. These calls work around the languages' lack of this functionality. INTOUCH has built-in statements to access system information. The following example reads and displays some of the information INTOUCH gives you about the current process. The example shows you the simple statements used to obtain the data. F_DATE_POST F_DATE_POST The preceeding program makes use of the following INTOUCH functions: days(yyyymmdd$) returns a "julian" date date$(jul, 0) returns a date in YYYYMMDD format date$(jul, 1) returns a date in MMDDYYYY format date$(jul, 2) returns a date in DDMMYYYY format date$(jul, 3) returns a date in DD-Mon-YYYY format date$(jul, 4) returns a date in Month DD, YYYY format day$(jul) returns a day of the week Using just these few INTOUCH date manipulation functions, you can easily do date calculations and convert dates into a wide variety of formats. F_DATE_PRE F_DATE_PRE INTOUCH includes a comprehensive selection of date manipulation functions: DATE$ returns today's date in YYYYMMDD format DAYS(str_expr) given a date in YYYYMMDD or YYMMDD format, returns its "julian" date DATE$(int_expr1, int_expr2) given a julian date and a format option, returns the date in one of 5 formats. DAY$(int_expr) given a julian date, returns the day of the week. F_ELEMENT_POST F_ELEMENT_POST INTOUCH delivers unparalleled functionality for manipulating text. One example of this parsing capability can be seen when breaking down existing fields or text strings into multiple fields. If a record has a single NAME field, INTOUCH can break down the field into LAST_NAME and FIRST_NAME fields using a space (" ") as a delimiter to separete the original field. INTOUCH gives you more text manipulation functionality than any 3GL or 4GL. Functions like "parsing" are seldom attempted in other languages because they are so difficult. INTOUCH makes functions like "parsing" very easy. F_ELEMENT_PRE F_ELEMENT_PRE This example demonstrates how easily you can break apart strings of data with INTOUCH. First, the example asks you for a DELIMITER (separator) to determine where each element begins and ends. The default delimiter is a comma. Second, the example asks you for a "DELIMITED STRING." This is a string of characters or group of characters separated by the delimiter you specified in the first question. The default is the comma-separated list "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday." The last question asks which element you would like to see. The default is element 3. If you take all of the defaults, the program tells you that you selected "Wednesday." The program then displays the single line of code needed to perform this entire function. F_EVAL_POST F_EVAL_POST Eval post... F_EVAL_PRE F_EVAL_PRE INTOUCH is ... F_EXECUTE_POST F_EXECUTE_POST ??Not implemented yet?? With INTOUCH, code can be compiled and executed at run-time. This feature lets you write generalized routines that evaluate and execute code "on the fly." F_EXECUTE_PRE F_EXECUTE_PRE ??Not implemented yet?? INTOUCH has the ability to dynamically compile and execute INTOUCH code at run-time. F_INPUT_AREA_POST F_INPUT_AREA_POST INTOUCH'S INPUT AREA facility allows you to input lengthy quantities of text in an easy and straightforward manner. There is no need to ask for several lines of text, one line at a time. The string resulting from an INPUT AREA can be stored in a data file. And, the string can be retrieved from the data record and used as the default for an INPUT AREA statement ... even if that area is defined by different coordinates from the original. F_INPUT_AREA_PRE F_INPUT_AREA_PRE The LINE INPUT AREA statement does input from an area on the screen. This area is usually more than one line long. It is often used to input text which is free-format and "conversational." Such text may consist of comments or long descriptions. The LINE INPUT AREA performs automatic word-wrapping, handles insert and delete, and allows the use of the arrow keys within the input area. Special "Gold" and "CTRL" key combinations are used to move to the beginning or end of a line, move to the top of bottom of the input area, to abort and exit, and to finish the input. LINE INPUT AREA gets input from a rectagular area on the screen defined by the upper-left row and column and the lower-right row and column. LINE INPUT AREA row, col, row, col : str_var F_INPUT_MENU_MAIN_POST F_INPUT_MENU_MAIN_POST INTOUCH gives you the ability to easily set up a main menu as the starting point of your application. As just seen, you can give your menu a title and headings, and can place it anywhere on the screen. You can control many other menu characteristics as well, including size, width and number of columns. Or you can let INTOUCH automatically determine those characteristics for you. F_INPUT_MENU_MAIN_PRE F_INPUT_MENU_MAIN_PRE In many applications, the first thing that a user will see is the main menu. With INTOUCH menus, the user simply uses arrow keys to select any menu item and then presses the RETURN key. INTOUCH makes it easy to set up a main menu as the starting point of your application using the MENU option of the INPUT statement. INPUT MENU str_expr : str_var Str_expr is a string expression that describes the menu. It consists of multiple comma-separated elements. The user's menu selection is returned in the string variable, str_var. F_INPUT_MENU_POP_POST F_INPUT_MENU_POP_POST INTOUCH makes it very easy to create pop-up menus. With a wide range of options available to the programmer, menus can be as simple as this example or as complex as you like. Unless otherwise directed, INTOUCH automatically determines menu width and screen position. F_INPUT_MENU_POP_PRE F_INPUT_MENU_POP_PRE Menus are a form of input often favored by users because they require the least amount of effort. The user simply uses the arrow keys to select the menu item and then presses the RETURN key. INTOUCH makes it easy to create pop-up menus using the MENU option of the INPUT statement. INPUT MENU str_expr : str_var Str_expr is a string expression that describes the menu. It consists of multiple comma-separated elements. The user's menu selection is returned in the string variable, str_var. F_INPUT_MENU_PULL_POST F_INPUT_MENU_PULL_POST INTOUCH makes it very easy to create pull-down menus. A pull-down menu can contain an unlimited number of items, because the menu bar scrolls left and right to bring additional items into view. Each menu item can call a sub-menu, and a sub-menu can call another sub-menu. F_INPUT_MENU_PULL_PRE F_INPUT_MENU_PULL_PRE Pull-down menus are a popular and often very useful forms of input. INTOUCH makes it easy to create pull-down menus, and users favor them because, like pop-up menus, they require little effort. The user simply uses arrow keys to select the menu item and then presses the RETURN key. F_INPUT_MENU_SUB_POST F_INPUT_MENU_SUB_POST INTOUCH gives you the ability to set up menu systems organized into main menus and sub-menus. Any menu item can call a sub-menu, and any sub-menu item can call another sub-menu. F_INPUT_MENU_SUB_PRE F_INPUT_MENU_SUB_PRE It is often useful for a menu item to bring up a sub-menu. This is easily accomplished with INTOUCH menus. Using the MENU option of INTOUCH's INPUT statement, you can set up menu items to call sub-menus. Items on sub-menus can also call other sub-menus. F_MATH_POST F_MATH_POST INTOUCH's comprehensive selection of built-in mathematical functions add versatility and simplify your programming tasks. F_MATH_PRE F_MATH_PRE INTOUCH contains a variety of built-in, mathematical functions useful in business arithmetic, trigonometry, and calculus: Built-in arithmetic functions: ABS(num_expr) absolute value CEIL(num_expr) smallest integer >= num_expr FP(num_expr) fractional part INT(num_expr) largest real <= num_expr INTEGER(num_expr) integer value IP(num_expr) integer part (truncates) MAX(num_expr, num_expr) larger of two values MIN(num_expr, num_expr) lesser of two values MOD(num_expr, num_expr) remainder of num_expr divided by num_expr REAL(num_expr) real or floating point value ROUND(num_expr, int_expr) rounds num_expr to int_expr decimal digits SGN(num_expr) sign (0, +1, -1) SQR(num_expr) square root STR$(num_expr) string representation of num_expr VAL(num_str) real representation of num_str Built-in functions used in trigonometry and calculus include: ACOS(num_expr) angle, in radians, whose cosine is num_expr ANGLE(num_expr, num_expr) angle, in radians, from 0,0 of coordinates ASIN(num_expr) angle, in radians, whose sine is num_expr ATN(num_expr) angle, in radians, of tangent COS(num_expr) cosine of angle specified in radians COT(num_expr) cotangent of num_expr CSC(num_expr) cosecant of num_expr DEG(num_expr) degrees of angle specified in radians RAD(num_expr) radians of angle specified in degrees SEC((num_expr) secant of num_expr SIN(num_expr) sine of angle specified in radians TAN(num_expr) tangent of angle specified in radians COSH(num_expr) hyperbolic cosine of num_expr SINH(num_expr) hyperbolic sine of num_expr TANH(num_expr) hyperbolic tangent of num_expr LOG(num_expr) natural logarithm of num_expr LOG2(num_expr) base 2 logarithm of num_expr LOG10(num_expr) common logarithm of num_expr F_PASS_POST F_PASS_POST With the PASS statement, INTOUCH gives you a simple interface to execute system (DCL) commands. With INTOUCH, you can use simple DCL commands to queue files for printing and to access all system utilities. The PASS statement also allows you to directly run other applications without leaving your INTOUCH program. Examples of this include application programs, VMS Mail, Edit, Print Services and VMS command procedures. F_PASS_PRE F_PASS_PRE Typically, in applications that print information, the most convenient path to the printer is through the VMS queueing system. In most languages this requires calls to system or library services. With INTOUCH, you can directly perform system commands (DCL) with the PASS statement. This statement executes system (DCL) commands from within your INTOUCH procedures. You can print files, execute command procedures, and use any other system (DCL) commands to make your applications simpler and more maintainable. You can even run other application programs. PASS "SHOW USERS" The PASS command suspends processing of INTOUCH, executes the DCL SHOW USERS command, and continues the INTOUCH program when complete.